У меня есть 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> ВЫЗОВ: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 - Copy (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 - Copy.txt "

Как вы можете видеть, ключевое слово "55" существует в UNC, но условие не проверяется на значение True в цикле FOR, и оно напрямую переходит к следующему UNC. Ниже приведен код -

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

1 ответ1

0

Вы можете перебрать список "ключевых слов" один раз и использовать повторяющиеся значения ключевых слов вместе с некоторыми вложенными подстановочными символами в качестве строк поиска, например *<Keyword>* . Вы можете пройтись по дереву каталогов каждого значения пути UNC из списка файлов и выполнить операцию копирования только для тех, которые существуют в соответствии со строкой поиска "ключевые слова".

По существу, хотя ...

  • Первый цикл for /f будет читать каждую строку списка строковых файлов одну за другой, и значение каждой строки будет повторяемым значением, которое передается в первом аргументе команде вызова .
  • Второй цикл for /f будет считывать каждую строку списка файлов пути UNC одну за другой и передавать ее и значение первого аргумента, переданное первым циклом for /f, как два аргумента с его командой вызова .
  • Последний цикл for /r будет рекурсивно искать итеративный путь 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

Дополнительные ресурсы

  • Для /F

  • Вызов

    Команда 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.
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .