Suchen und Kopieren von Dateien aus einer Verzeichnisstruktur durch Lesen einer Textdatei

313
Regmi

Ich habe einen Ordner mit vielen Unterordnern und Dateien darin. Ich habe eine Textdatei mit den Namen der Dateien, die ich in einen separaten Zielordner kopieren möchte. Die Dateinamen in der Textdatei enthalten keine Pfadinformationen.

Im Zielordner möchte ich, dass die Datei und ihre Ordnerstruktur neu erstellt werden. Gibt es dafür ein schnelles Skript? oder ein Werkzeug? Ich bin unter Windows.

1
Ausgangspunkt für den Aufbau, aber das ist für einen Batch-Scripter wie ich einfach trivial ... `FOR / F" USEBACKQ TOKENS = * "% A IN (" C: \ Ordner \ Pfad \ TextFile.txt ") DO ECHO % ~ A`. . . https://ss64.com/nt/for_cmd.html. . . Lesen Sie einige meiner Antworten, die zutreffend sind, wählen Sie einige aus und lesen Sie, wie ich sicher bin, dass ich hier schon jemandem geholfen habe: https://superuser.com/search?q=user%3A510662+body%3A+ für +% 2Ff Pimp Juice IT vor 6 Jahren 1

1 Antwort auf die Frage

2
LotPings

Das folgende PowerShell-Skript sollte das tun, was Sie möchten.

Ändern Sie die ersten drei Variablen entsprechend Ihrer Umgebung.

## Q:\Test\2018\06\28\SU_1334840.ps1 #Requires -Version 3  # get files to copy from file in same foler $FileList = Get-Content '.\FileList.txt' $BaseSrc = 'X:\Source\path\' $BaseDst = 'Y:\Destination\path\'  ForEach ($File in $FileList){ ForEach ($Find in (Get-ChildItem $BaseSrc$File -File -Recurse)) { $DestFile = Join-Path $BaseDst ($Find.FullName.Replace($BaseSrc,'') ) $DestDir = Split-Path $DestFile If (!(Test-Path $DestDir)){ MD $DestDir |Out-Null} # "Copying to " -f $Find.FullName,$DestFile Copy-Item $Find.FullName $DestFile } } 

Um zu sehen, was passiert, während das Skript funktioniert, entfernen Sie das #Vorherige"Copying...

Für das Skript ist mindestens PowerShell Version 3 erforderlich

Je nach Größe Ihrer Liste / Anzahl der Dateien und Unterverzeichnisse in Ihrem Quellbaum kann diese Vorgehensweise etwas schneller sein.

## Q:\Test\2018\06\28\SU_1334840_2.ps1 #Requires -Version 3  # get files to copy from file in same foler $FileList = Get-Content '.\FileList.txt' $BaseSrc = 'X:\Source\path\' $BaseDst = 'Y:\Destination\path\'  ForEach ($File in (Get-ChildItem $BaseSrc -File -Recurse)) { If ($File.Name -in $FileList) { $DestFile = Join-Path $BaseDst ($File.FullName.Replace($BaseSrc,'') ) $DestDir = Split-Path $DestFile If (!(Test-Path $DestDir)){ MD $DestDir |Out-Null} "Copying to " -f $File.FullName,$DestFile Copy-Item $File.FullName $DestFile } } 

Beispielausgabe:

> . Q:\Test\2018\06\28\SU_1334840.ps1 Copying C:\sys\7z.dll to A:\Test\sys\7z.dll Copying C:\sys\7z.exe to A:\Test\sys\7z.exe Copying C:\sys\ClipBoard.exe to A:\Test\sys\ClipBoard.exe Copying C:\sys\ClipBoard.txt to A:\Test\sys\ClipBoard.txt Copying C:\sys\DUMPHEX.EXE to A:\Test\sys\DUMPHEX.EXE 
Das funktioniert, aus irgendeinem Grund findet das Skript einige Dateien wie "00-00-00_0001 0894 0007861.JPG" nicht. Gibt es eine Möglichkeit, aufzulisten, welche Dateien nicht gefunden wurden? (Bemerken Sie das Leerzeichen zwischen dem Öffnen von Anführungszeichen und der ersten 0 in diesem Dateinamen ?! Regmi vor 6 Jahren 0
Wir haben eine Lösung für solche Dateien gefunden. Wir haben allen Dateinamen in der Textdatei ein * vorangestellt. Vielen Dank! Regmi vor 6 Jahren 0
Vielen Dank für Ihr Feedback, gerade aus Interesse - welche Variante war schneller in Ihren Versuchen? LotPings vor 6 Jahren 0
Der erste war tatsächlich besser und ich habe ihn am Ende benutzt! Ich habe ungefähr 17k Dateinamen in der FileList.txt und Maschine ist ein 16G RAM, Win 2012 Server. Regmi vor 6 Jahren 0
Wow, von diesen Zahlen hätte ich erwartet, dass letzteres führend ist, aber das Zwischenspeichern von Dateiservern scheint es zu ändern. LotPings vor 6 Jahren 0
Du hast recht! Entschuldigen Sie. Wir hatten es früher mit einer wesentlich kleineren Beispieldatei versucht. In der Tat ist das zweite Skript viel schneller als das erste. :) Danke noch einmal. [Es gab jedoch ein Problem. Wir hatten * in allen Dateinamen vorangestellt. Das zweite Skript mag diese Sterne nicht, es erzeugt keine Ausgabe. Also haben wir die Dateiliste zurückgesetzt.] Regmi vor 6 Jahren 0