2012-04-03 13 views
13

Ich möchte in der Lage sein, ein PowerShell-Skript zu schreiben, das einen Ordner (oder einen Satz von Ordnern) übernehmen würde und in dem die Ordnerstruktur (ohne Dateien) erstellt werden, wo die Dateistruktur (ohne die Ordner) erstellt werden könnte, oder in der sowohl die Dateien (alle oder ausgewählte) AND Ordner erstellt werden könnten.Kopieren von Ordnern ohne Dateien, Dateien ohne Ordner oder alles mit 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 

Jeder Ordner oben hat eine Vielzahl von Dateien unterschiedlicher Größe in verschiedenen Dateierweiterungen.

Ich mag einen Powershell-Skript haben, dass die Ordnerstruktur an anderer Stelle kopieren würde, mir eine Auswahl von Ordnerstruktur gab nur, Dateien Nur oder Dateien und Ordner kopiert werden.

Im obig ich möchte in der Lage sein C zu kopieren: \ ProdData in einem anderen Ordner, im Wesentlichen ProdData zu Testdata Umbenennung (das heißt, C: \ ProdData zu C kopiert: \ Testdata), oder um die gesamte Ordnerstruktur zu kopieren.

C:\ProdData in einen anderen Ordner, der ein Unterordner von etwas anderes: C:\TestArea\TestFolders\2012-04-01\TestData\ProdData\Fld1, etc ...

Und selektiv wählen Ordner, Dateien oder beide aufzunehmen.

Die ideale Lösung wäre, (nur für Ordner) die Ordnerstruktur zu übernehmen, sie zu exportieren/speichern, sie einzulesen und dieselbe Struktur an anderer Stelle zu erstellen. Einige Lösungen, die ich gefunden habe, sagten, dass sie nur die Ordnerstruktur kopiert haben, aber wenn Daten existieren, wird das auch kopiert und du kannst das eine oder das andere nicht ausschließen. Ich habe eine Teillösung für das Dateien-einzige Anforderung, die den Weg halb bewahrt, aber es wäre eine Datei nehmen:

c:\ProdData\Fld1\MyFile.dat 

und kopieren Sie sie auf:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat 

Aber das ist nicht etwas, das könnte leicht decodiert werden und es wäre unmöglich, die Quellstruktur wieder zu integrieren. Ich würde mich freuen, wenn ich darüber nachdenke, wie ich das erreichen kann, ohne das Rad neu zu erfinden.

Antwort

13

Um alles in einem Ordner hierarchie

Copy-Item $source $dest -Recurse -Force 

Um die hierarchie zu kopieren Sie können versuchen, zu kopieren:

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

eine Dateistruktur zu glätten können Sie versuchen:

$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} 

Viel Glück!

26

Hier sind einige Ideen für den Umgang mit jeder Situation, die Sie beschreiben.

Ordnerstruktur Nur

Dies wird die Quelle zu einem Ziel kopieren, Rekursion Unterverzeichnisse aber ohne alle Dateien.

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

Dateien Nur (Flatten Structure)

Es gibt ein paar Möglichkeiten, dies zu umgehen, aber ich weiß nicht, von einem besonders guten oder elegante Art und Weise. Hier ist ein umständlicher, aber effektiver Ansatz - für jedes Unterverzeichnis wird eine nicht-rekursive Kopie in einen Root-Zielordner ausgeführt. Kritik oder nettere Alternativen wären sehr willkommen.

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

Alles

Dieses Szenario ist die einfachste der Gruppe.

robocopy $source $dest /e 

Sie können sich mit den Schaltern experimentieren das Verfahren zur Feinabstimmung (robocopy /? auf dem Weg Referenzierung). Das schwierigste Szenario ist meiner Meinung nach das, das die Verzeichnisstruktur abflacht. Sie müssen einige Entscheidungen treffen, z. B. wie Sie denselben Dateinamen in mehreren Verzeichnissen verwenden möchten.

Um Optionen über die Befehlszeile zu akzeptieren, würde ich vorschlagen, Powershell-Parametersätze für Ihre drei Situationen zusammenzustellen. Es gibt eine Reihe von Blog-Posts, die das Konzept diskutieren, aber Sie können auch TechNet sehen oder help about_Functions_Advanced_Parameters in Powershell ausführen.

+0

Dank. Ich hatte Robocopy nicht einmal installiert und es entspricht den Bedürfnissen ziemlich gut. Was ich für die Struktur zu einer Datei getan habe, war, Show-Tree zu einer Textdatei zu pipen. Das brachte ein anderes Stück von dem, was ich suchte. Keine Sache würde alles tun, aber 3 relativ einfache Stücke zusammen vollbrachten, was ich brauchte. Vielen Dank für Ihre Hilfe! –

+0

Für die abgeflachte, können Sie den mittleren Abschnitt überspringen und einfach die Option -File auf Get-ChildItem like (und Copy-Item statt Robocopy) verwenden: Get-ChildItem $ source -Recurse -Datei | Foreach-Objekt {Kopie-Item $ _. FullName $ dest}. Kein großer Unterschied. – Brandon

+1

@Brandon Guter Punkt. Solange Sie sich auf Powershell 3 befinden, können Sie das sicher tun (die Parameter '-File' und' -Directory' existierten erst ab v3). – ajk

1

Die folgenden Kopien nur die Ordnerstruktur bilden ProdData zu Testdata ohne Dateien für den Vorschlag

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

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

Verwandte Themen