Kopieren Sie Netzwerkdateien mit übereinstimmenden Dateinamen aus einer Dateiliste mit Windows Batch Script

359
Sujitkar

Ich habe 2 Dateien, von denen 1 bestimmte Schlüsselwörter enthält und die andere eine Liste von Pfaden enthält. Ich möchte die Schlüsselwörter aus der ersten Dateiliste in die Liste der Dateipfade durchsuchen und wenn sie gefunden werden, kopieren Sie die Dateien aus dem angegebenen Dateipfad in einen bestimmten Zielordner.

Erster Dateiinhalt

Keyword1 Keyword2 Keyword3 Keyword4 

Zweite Dateiinhalt

\\server\path...\Keyword1.txt \\server\path...\Keyword1_0_1.txt \\server\path...\Keyword2_0_1.txt \\server\path...\Keyword2_1_9.txt \\server\path...\Keyword3_1_0_1.txt 

Dafür muss ich das Windows-Batch-Skript schreiben.

================================================== ==========

Sorry @ pimp-juice-it Ich bin mir nicht sicher, wie ich den Screenshot einfügen soll. Daher kopieren Sie die Ausgabe unten -

d: \ Temp_Script \ Script> FOR / R "D: \ Temp_Script \ Source \ 33.txt"% G IN (55 *) DO ECHO "55" d: \ Temp_Script \ Script> CALL: FileExist "55" "D: \ Temp_Script \ Source \ 44.txt "d: \ Temp_Script \ Script> FOR / R" D: \ Temp_Script \ Source \ 44.txt "% G IN (55 *) DO ECHO" 55 "d: \ Temp_Script \ Script> CALL: FileExist "55" "D: \ Temp_Script \ Source \ 55.txt" D: \ Temp_Script \ Script> FOR / R "D: \ Temp_Script \ Source \ 55.txt"% G IN (55 *) DO ECHO " 55 "d: \ Temp_Script \ Script> CALL: FileExist" 55 "" D: \ Temp_Script \ Source \ 55 - Kopieren (2) .txt "d: \ Temp_Script \ Script> FOR / R" D: \ Temp_Script \ Source \ 55 - Kopieren (2) .txt "% G IN (55 *) DO ECHO" 55 d: \ Temp_Script \ Script> CALL: FileExist "55" "D: \ Temp_Script \ Source \ 55 - Copy.txt"

Wie Sie sehen, ist das Schlüsselwort "55" in der UNC vorhanden. Die Bedingung wird jedoch in der FOR-Schleife nicht als "True" bestätigt und es wird direkt zur nächsten UNC weitergeleitet. Unten ist der Code -

: FileExist FOR / R "% ~ 2" %% G IN (% ~ 1 *) DO ECHO "% ~ 1"

0
Ich würde empfehlen, anstelle der Stapelverarbeitung etwas anderes zu verwenden. Eine dieser Dateien muss so oft gelesen werden, wie eine Zeile in der zweiten zählt ... PS. Verwenden Sie zum Beispiel das VBS-Skript ... Akina vor 5 Jahren 0

1 Antwort auf die Frage

0
Pimp Juice IT

Sie können Schleife durch das „Stichwort“ -Liste einmal und verwenden Sie die iteriert Schlüsselwort Werte zusammen mit einigen eingeschlossenen Platzhalter als Suchzeichenketten, dh *<Keyword>* . Sie können die Verzeichnisstruktur jedes UNC-Pfadwerts von seiner Dateiliste aus aufrufen und den Kopiervorgang nur für diejenigen ausführen, die mit der Suchzeichenfolge "Schlüsselwörter" übereinstimmen.

Im Wesentlichen aber ...

  • Die erste for / f- Schleife liest jede Zeile der String-Dateiliste nacheinander, und der Wert jeder Zeile ist ein iterierter Wert, der beim ersten Argument an den Aufrufbefehl übergeben wird .
  • Die zweite for / f- Schleife liest jede Zeile der UNC-Pfaddateiliste nacheinander und übergibt sie und den ersten Argumentwert, der von der ersten for / f- Schleife übergeben wird, als zwei Argumente mit ihrem Aufrufbefehl .
  • Die letzte for / r- Schleife durchsucht den iterierten UNC-Pfad rekursiv mit dem iterierten String-Wert als separate Argumente, die übergeben wurden, und kopiert dann alle übereinstimmenden Dateien.

Batch-Skript

@ECHO ON  SET "strList=\\server\Folder\Path\SearchStrings.txt" SET "pathList=\\server\Folder\Path\UNCPaths.txt" SET "targetPath=\\server\target\folder\path"  FOR /F "USEBACKQ TOKENS=*" %%S IN ("%strList%") DO CALL :Paths "%%~S" PAUSE EXIT  :Paths FOR /F "USEBACKQ TOKENS=*" %%P IN ("%pathList%") DO CALL :FileExist "%~1" "%%~P" GOTO :EOF  :FileExist FOR /R "%~2" %%C IN (*%~1*) DO XCOPY /F /Y "%%~C" "%targetPath%\" GOTO :EOF 

Weitere Ressourcen

  • Für / F

  • Anruf

    Der CALL-Befehl übergibt die Steuerung nach der angegebenen Bezeichnung zusammen mit den angegebenen Parametern an die Anweisung. Um das Unterprogramm zu verlassen, GOTO:eofwird die Steuerung an das Ende des aktuellen Unterprogramms übergeben.

  • Für / R

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]  Walks the directory tree rooted at [drive:]path, executing the FOR statement in each directory of the tree. If no directory specification is specified after /R then the current directory is assumed. If set is just a single period (.) character then it will just enumerate the directory tree. 
Sujitkar - Entfernen Sie einfach die "PAUSE" -Datei, um sie zu beenden, aber passen Sie sie entsprechend Ihren Bedürfnissen an. Gerne bei den Anpassungen helfen, wenn nötig, also erklären Sie es mir und lassen Sie es mich wissen. Pimp Juice IT vor 5 Jahren 0
Danke für so eine detaillierte Lösung @ pimp-juice-it. Aber ich kann das nicht dazu bringen, dass FOR / R "% ~ 2" %% C IN (*% ~ 1 *) funktioniert. Diese Bedingung wird niemals True zurückgeben. Sujitkar vor 5 Jahren 0
@Sujitkar - Können Sie mir einen Screenshot oder etwas von der Ausgabe des Befehls senden, wenn Sie ihn ausführen, oder ein paar Zeilen davon für ein paar Iterationen? Vielleicht gibt es etwas, das ich mit Ihrem Setup missverstanden habe. Wenn Sie mir dabei helfen können zu verstehen, kann ich mich vielleicht an Ihre Bedürfnisse anpassen. Pimp Juice IT vor 5 Jahren 0
@Sujitkar Außerdem gehe ich vielleicht falsch aus, aber zum Beispiel, wenn Sie `Keyword1` haben und dann haben Sie einen UNC-Serverpfad ohne den Dateinamen in der Datei, also einfach` \\ Server \ Pfad ... `so und dann dort sollte ein Dateiname mit `Keyword1`-Zeichen in dem Pfad sein, den Sie kopieren möchten; Die Liste der UNC-Pfaddateien mit dieser Methode sollte NICHT die Dateinamen mit den Schlüsselwörtern und nur den Pfad enthalten, der nur dazu dient. Möglicherweise funktioniert es deshalb nicht, wenn die Liste der UNC-Pfaddateien mehr enthält als nur die Liste des UNC-Ordnerpfads. Pimp Juice IT vor 5 Jahren 0
@Sujitkar Ich habe dir ein paar Kommentare zwischen dieser Antwort und deiner obigen Frage hinterlassen, also wollte ich sehen, ob du bestätigen könntest, dass du alle ** lesen würdest, und ich bin auch neugierig, ob dies hilft, irgendwelche zu klären? Ich bin bemüht, Ihnen zu helfen, diese einfache Aufgabe zu lösen, damit Sie sie von Ihrer Liste entfernen und mit einem besseren Verständnis fortfahren und gleichzeitig ein wenig lernen können. Lassen Sie mich wissen, was ich tun kann, um Sie besser zu verstehen und / oder diese einfache Aufgabe zu lösen. Pimp Juice IT vor 5 Jahren 0
@Sujitkar Letzter Kommentar jetzt und wird warten, von Ihnen zu hören .... Wie in diesem Bildschirmfoto https://i.imgur.com/3chEhdJ.png können Sie die "Werte" des grünen Abschnitts Nr. 1 ändern, aber tun Sie dies Ändern Sie nichts mit der roten Sek- te Nr. 2, und die `PAUSE` mit der kleinen orangefarbenen Linie ist optional. Entfernen Sie also entweder die gesamte Linie oder lassen Sie sie unverändert. Viel Glück! Pimp Juice IT vor 5 Jahren 0
@Sujitkar Wie ist der Status dazu? Pimp Juice IT vor 5 Jahren 0