У меня есть 2 файла, один из которых содержит определенные ключевые слова, а другой — список путей. Я хочу выполнить поиск ключевых слов из первого списка файлов в списке путей файлов, и если они будут найдены, то скопировать файлы из указанного пути в определенную целевую папку.
Содержимое первого файла
Keyword1
Keyword2
Keyword3
Keyword4
Содержимое второго файла
\\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
Для этой цели мне придется написать пакетный скрипт Windows.
============================================================
Извините @pimp-juice-it, я не уверен, как вставить скриншот. Поэтому копирую-вставляю вывод ниже -
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 - Копировать (2).txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\55 - Копировать (2).txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55 - Копировать.txt"
как вы можете видеть, ключевое слово "55" существует в UNC, но условие все еще не проверяется на True в цикле FOR и оно переходит к следующему UNC напрямую. Ниже приведен код -
:ФайлСуществует FOR /R "%~2" %%G IN (%~1*) DO ECHO "%~1"
решение1
Вы можете выполнить цикл по списку «ключевых слов» один раз и использовать итерированные значения ключевых слов вместе с некоторыми заключенными в них подстановочными знаками в качестве строк поиска.то есть *<Keyword>*
. Вы можете пройти по дереву каталогов каждого значения пути UNC из его списка файлов и выполнить операцию копирования только тех, которые существуют и соответствуют строке поиска «ключевые слова».
Но по сути...
- Первыйдля /фЦикл будет читать каждую строку списка строкового файла одну за другой, и значение каждой строки будет итерированным значением, которое передается в первом аргументе функции вызовкоманда.
- Второйдля /фцикл будет читать каждую строку списка файлов UNC-путей одну за другой и передавать ее вместе со значением первого аргумента, переданным первымдля /фцикл как два аргумента с его вызовкоманда.
- Последнийдля /рЦикл будет рекурсивно искать итерированный UNC-путь с итерированным строковым значением в качестве отдельных переданных аргументов, а затем копировать все соответствующие файлы.
Пакетный скрипт
@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
Дополнительные ресурсы
-
Команда CALL передаст управление оператору после указанной метки вместе с любыми указанными параметрами. Для выхода из подпрограммы укажите,
GOTO:eof
что это передаст управление в конец текущей подпрограммы. -
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.