2012-04-03 15 views
13

Vorrei poter scrivere uno script PowerShell che prendesse una cartella (o una serie di cartelle) e duplicarli in cui la struttura della cartella (senza il file) possono essere creati, dove è possibile creare la struttura dei file (senza le cartelle) o in cui è possibile creare sia i file (tutti o selezionati) E cartelle.Copia le cartelle senza file, file senza cartelle o tutto ciò che utilizza PowerShell

Example: 

    C:\ProdData has 3 subfolders in it 
    C:\ProdData\Fld1 
    C:\ProdData\Fld2 
    C:\ProdData\Fld3 - has 2 subfolders under it 
    C:\ProdData\Fld3\MyFolder1 
    C:\ProdData\Fld3\MyFolder2 

Ogni cartella in alto ha un diverso numero di file di varie dimensioni, di varie estensioni di file.

mi piacerebbe avere uno script PowerShell che avrebbe duplicato che struttura delle cartelle altrove, dandomi una scelta di Struttura delle cartelle Solo, file Solo, o file e cartelle da copiare.

In quanto sopra, mi piacerebbe essere in grado di copiare C: \ ProdData in un'altra cartella, in sostanza, la ridenominazione ProdData a TestData (cioè, C: \ ProdData copiati C: \ TestData), o per copiare l'intera struttura della cartella.

C:\ProdData in un'altra cartella che è una sottocartella di qualcos'altro: C:\TestArea\TestFolders\2012-04-01\TestData\ProdData\Fld1, ecc ...

e selettivamente scegliere di includere le cartelle, file o entrambi .

La soluzione ideale sarebbe (solo per le cartelle) prendere la struttura della cartella, esportarla/salvarla, leggerla e creare la stessa struttura altrove. Alcune soluzioni che ho trovato hanno detto che copiavano solo la struttura delle cartelle, ma se i dati esistono, anche quelli vengono copiati e non è possibile escluderne uno o l'altro. Ho una soluzione parziale al requisito solo file che semi-conserva il percorso, ma ci vorrebbe un file:

c:\ProdData\Fld1\MyFile.dat 

e copiarlo:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat 

Ma non è qualcosa che potrebbe facilmente decodificati e sarebbe impossibile reintegrare la struttura sorgente. Gradirei qualsiasi idea su come realizzare questo senza reinventare la ruota.

risposta

13

Per copiare tutto in una hierarchie cartella

Copy-Item $source $dest -Recurse -Force 

Per copiare il hierarchie si può provare:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force 

per appiattire una struttura di file si può provare:

$source = "C:\ProdData" 
$dest = "C:\TestData" 
New-Item $dest -type directory 
Get-ChildItem $source -Recurse | ` 
    Where-Object { $_.PSIsContainer -eq $False } | ` 
    ForEach-Object {Copy-Item -Path $_.Fullname -Destination $dest -Force} 

Buona fortuna!

26

Ecco alcune idee per gestire ogni situazione che descrivi.

Struttura delle cartelle Solo

Ciò copiare il codice sorgente a una destinazione, recursing sottodirectory ma escludendo tutti i file.

robocopy $source $dest /e /xf *.* 

Solo Files (Appiattire Structure)

ci sono alcuni modi per gestire questo, ma non so di un modo particolarmente buono o elegante. Ecco un approccio scomodo ma efficace: per ogni sottodirectory, esegue una copia non ricorsiva in una cartella di destinazione principale. Critiche o alternative più piacevoli sarebbero le benvenute.

Get-ChildItem $source -Recurse | 
    Where-Object { $_.PSIsContainer -eq $true } | 
    Foreach-Object { robocopy $_.FullName $dest } 

Tutto

Questo scenario è il più semplice del gruppo.

robocopy $source $dest /e 

Si può sperimentare con gli interruttori da soli (che fanno riferimento robocopy /? lungo la strada) per mettere a punto il processo. Secondo me, lo scenario più difficile è quello che appiattisce la struttura delle directory. Avrai alcune decisioni da prendere, ad esempio come vuoi gestire lo stesso nome di file che appare in più directory.

Per quanto riguarda come accettare le opzioni dalla riga di comando, suggerirei di mettere insieme i set di parametri di Powershell per le tre situazioni. Ci sono un certo numero di post sul blog che parlano del concetto, ma puoi anche vedere TechNet o eseguire help about_Functions_Advanced_Parameters all'interno di PowerShell.

+0

Grazie per il suggerimento. Non avevo nemmeno installato Robocopy, e si adatta abbastanza bene alle esigenze. Quello che ho dovuto fare per la struttura di un file è stato il pipe di Show-Tree in un file di testo. Questo ha compiuto un altro pezzo di ciò che stavo cercando. Nessuna cosa farebbe tutto, ma 3 pezzi relativamente semplici insieme hanno raggiunto ciò di cui avevo bisogno. Grazie per il vostro aiuto! –

+0

Per lo spianamento, è possibile saltare la sezione centrale e utilizzare semplicemente l'opzione -File su Get-ChildItem come (e Copia-Elemento invece di robocopy): Get-ChildItem $ origine -Recurse -File | Foreach-Object {Copy-Item $ _. FullName $ dest}. Non un'enorme differenza però. – Brandon

+1

@Brandon Buon punto. Finché sei su Powershell 3 puoi certamente farlo (i parametri '-File' e' -Directory' non esistevano fino alla v3). – ajk

1

I seguenti copie solo la struttura delle cartelle di forma ProdData a TestData senza alcun file

$from = "C:\ProdData" 
 
$to = "C:\TestData" 
 

 
Get-ChildItem -Path $from -Recurse | 
 
?{ $_.PSIsContainer } | 
 
Copy-Item -Destination {Join-Path $to $_.Parent.FullName.Substring($from.length)} -Force

Problemi correlati