Ich habe 2 Dateien, von denen eine bestimmte Schlüsselwörter enthält und die andere eine Liste mit Pfaden. Ich möchte die Schlüsselwörter aus der ersten Dateiliste in der Liste mit Dateipfaden suchen und, falls gefunden, die Dateien aus dem angegebenen Dateipfad in einen bestimmten Zielordner kopieren.
Erster Dateiinhalt
Keyword1
Keyword2
Keyword3
Keyword4
Zweiter 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
Dazu muss ich das Windows-Batch-Skript schreiben.
============================================================
Tut mir leid, @pimp-juice-it, ich bin nicht sicher, wie ich den Screenshot einfügen soll. Daher kopiere ich die Ausgabe unten ein -
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 - Kopie (2).txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\55 - Kopie (2).txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55 - Kopie.txt"
wie Sie sehen, ist das Schlüsselwort „55“ im UNC vorhanden, aber die Bedingung wird in der FOR-Schleife trotzdem nicht als True validiert und es wird direkt zum nächsten UNC gewechselt. Unten sehen Sie den Code -
:FileExist FOR /R "%~2" %%G IN (%~1*) DO ECHO "%~1"
Antwort1
Sie können die Liste der „Schlüsselwörter“ einmal durchlaufen und die iterierten Schlüsselwortwerte zusammen mit einigen eingeschlossenen Platzhalterzeichen als Suchzeichenfolgen verwenden.dh *<Keyword>*
. Sie können den Verzeichnisbaum jedes UNC-Pfadwerts von seiner Dateiliste aus durchgehen und den Kopiervorgang nur für die vorhandenen Werte ausführen, die mit der Suchzeichenfolge „Schlüsselwörter“ übereinstimmen.
Im Wesentlichen aber ...
- Der erstefür /fDie Schleife liest jede Zeile der String-Dateiliste nacheinander und der Wert jeder Zeile ist ein iterierter Wert, der als erstes Argument an den AnrufBefehl.
- Der Zweitefür /fDie Schleife liest jede Zeile der UNC-Pfaddateiliste nacheinander und übergibt sie und den ersten Argumentwert, der von der ersten übergeben wirdfür /fSchleife als zwei Argumente mit ihrer AnrufBefehl.
- Das Letztefür /rDie Schleife durchsucht rekursiv den iterierten UNC-Pfad mit dem iterierten Zeichenfolgenwert als separate übergebene Argumente und kopiert anschließend 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
-
Der CALL-Befehl übergibt die Steuerung an die Anweisung nach dem angegebenen Label zusammen mit den angegebenen Parametern. Um die Subroutine zu verlassen, geben Sie
GOTO:eof
dies an, um die Steuerung an das Ende der aktuellen Subroutine zu übertragen. -
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.