it-swarm.com.de

Kopieren Sie Ordner ohne Dateien, Dateien ohne Ordner oder alles mit PowerShell

Ich möchte in der Lage sein, ein PowerShell-Skript zu schreiben, das einen Ordner (oder eine Gruppe von Ordnern) aufnehmen und diese duplizieren würde, in denen die Ordnerstruktur (ohne die Dateien) erstellt werden könnte, in der die Dateistruktur (ohne Ordner) könnte erstellt werden oder in dem sowohl die Dateien (alle oder ausgewählte)ALS AUCHOrdner erstellt werden könnten.

    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 enthält eine Vielzahl von Dateien unterschiedlicher Größe und verschiedener Dateierweiterungen.

Ich hätte gerne ein PowerShell-Skript, das diese Ordnerstruktur an anderer Stelle dupliziert und mir die Wahl zwischen Folder Structure Only , Files Only oder Files AND Folders gibt, die kopiert werden sollen.

Ich möchte in der Lage sein, C:\ProdData in einen anderen Ordner zu kopieren und ProdData im Wesentlichen in TestData umzubenennen (dh C:\ProdData kopiert in C:\TestData ). oder um die gesamte Ordnerstruktur zu kopieren.

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

Wählen Sie außerdem Ordner, Dateien oder beide aus.

Die ideale Lösung wäre, (nur für Ordner) die Ordnerstruktur zu übernehmen, zu exportieren/speichern, einzulesen und an anderer Stelle dieselbe Struktur zu erstellen. Einige Lösungen, die ich gefunden habe, sagten, sie kopierten nur die Ordnerstruktur, aber wenn Daten vorhanden sind, werden auch diese kopiert, und Sie können die eine oder andere nicht ausschließen. Ich habe eine Teillösung für die Anforderung von Dateien, die den Pfad teilweise konserviert, aber es würde eine Datei erfordern:

c:\ProdData\Fld1\MyFile.dat

und kopiere es nach:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat

Dies könnte jedoch nicht leicht entschlüsselt werden und es wäre unmöglich, die Quellstruktur wieder zu integrieren. Ich würde mich über alle Gedanken freuen, wie ich das erreichen könnte, ohne das Rad neu zu erfinden.

18
steve_o

Um alles in einem Ordner hierarchie zu kopieren

Copy-Item $source $dest -Recurse -Force

Um die Hierarchie zu kopieren, kannst du Folgendes versuchen:

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

Um eine Dateistruktur zu reduzieren, kannst du Folgendes 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!

19
Reinout

Hier finden Sie einige Vorschläge zum Umgang mit jeder Situation, die Sie beschreiben.

Nur Ordnerstruktur

Dadurch wird die Quelle an ein Ziel kopiert, wobei die Unterverzeichnisse rekursiert werden, jedoch alle Dateien ausgeschlossen werden.

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

Nur Dateien (Struktur abflachen)

Es gibt einige Möglichkeiten, damit umzugehen, aber ich kenne keinen besonders guten oder eleganten Weg. Hier ist ein umständlicher, aber effektiver Ansatz - Für jedes Unterverzeichnis wird eine nichtrekursive Kopie in einen Stammzielordner ausgeführt. Kritik oder schönere Alternativen wären sehr willkommen.

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

Alles

Dieses Szenario ist das unkomplizierteste.

robocopy $source $dest /e

Sie können mit den Schaltern selbst experimentieren (entlang des Weges auf robocopy /? referenzieren), um den Prozess zu optimieren. Das schwierigste Szenario ist meiner Meinung nach das, das die Verzeichnisstruktur flacher macht. Sie müssen einige Entscheidungen treffen, z. B. wie Sie mit demselben Dateinamen in mehreren Verzeichnissen umgehen möchten.

Für das Akzeptieren von Optionen über die Befehlszeile empfehle ich, Powershell-Parametersätze für Ihre drei Situationen zusammenzustellen. Es gibt eine Reihe von Blogbeiträgen, in denen das Konzept behandelt wird. Sie können jedoch auchTechNetanzeigen oder help about_Functions_Advanced_Parameters in Powershell ausführen.

30
ajk

Das folgende Beispiel kopiert nur die Ordnerstruktur ProdData ohne Dateien in TestData

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

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

1
Fred B

Ich schlage meine Lösung vor:

$source = "C:\temp\"
$dest = "C:\TestData\"

#create destination directory if dont exist
New-Item -ItemType Directory $dest -Force


#To copy everything in a folder hierarchie
Get-ChildItem $source -Recurse | Copy-Item -Destination {$_.FullName.Replace($source, $dest)}  -Force

#To copy only directory hierarchie:
Get-ChildItem $source -Recurse -directory | Copy-Item -Destination {$_.FullName.Replace($source, $dest)}  -Force

#To copy only file (remove doublon be carefull):
Get-ChildItem $source -Recurse -file | Copy-Item -Destination $dest -Force
0
Esperento57