Скопируйте сетевые файлы с соответствующими именами файлов из списка файлов с помощью Windows Batch Script

249
Sujitkar

У меня есть 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"

0
Я бы рекомендовал использовать что-то другое вместо пакетной обработки. Один из этих файлов должен быть прочитан столько раз, сколько строк во втором ... PS. Используйте скрипт VBS, например ... Akina 5 лет назад 0

1 ответ на вопрос

0
Pimp Juice IT

Вы можете перебрать список «ключевого слова» один раз и использовать итерационные значения ключевых слов наряду с некоторыми вложенными символами подстановки в качестве строки поиска, то есть *<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. 
Суджиткар - Просто удалите «ПАУЗУ», чтобы она «вышла», когда закончите, но при необходимости измените ее в соответствии с вашими потребностями. Рад помочь с корректировками, если это необходимо, поэтому просто объясните и дайте мне знать. Pimp Juice IT 5 лет назад 0
Спасибо за такое подробное решение @ pimp-juice-it. Но я не могу заставить это работать FOR / R "% ~ 2" %% C IN (*% ~ 1 *). Это условие никогда не вернет True. Sujitkar 5 лет назад 0
@Sujitkar - Можете ли вы выслать мне снимок экрана или что-то из вывода команды при запуске или нескольких строк для пары итераций? Может быть, я неправильно понял вашу настройку, поэтому, если вы можете помочь мне понять, то, возможно, я смогу по-прежнему работать для ваших нужд. Pimp Juice IT 5 лет назад 0
@Sujitkar Также, возможно, я предполагаю, что неправильно, но, например, если у вас есть `Keyword1`, а затем у вас есть UNC-путь к серверу без имени файла в файле, так что просто \\ server \ path ...` вот так, а затем должно быть именем файла с символами `Keyword1` в том пути, который вы хотите скопировать, если он существует. Список файлов пути UNC с этим методом НЕ должен содержать имена файлов с ключевыми словами и только путь только для того, чтобы это работало. Возможно, именно поэтому он не работает, если список файлов пути UNC содержит больше, чем просто список путей к папке UNC. Pimp Juice IT 5 лет назад 0
@Sujitkar Я оставил вам несколько комментариев между этим ответом и вашим вопросом выше, так что я хотел посмотреть, можете ли вы подтвердить, что вы прочитали ** все ** эти вопросы, и мне также любопытно, поможет ли это уточнить какие-либо? Я хочу помочь вам решить эту простую задачу, чтобы вы могли проверить ее в своем списке и двигаться дальше с лучшим пониманием и в то же время учиться. Дайте мне знать, что я могу сделать, чтобы помочь вам лучше понять и / или решить эту простую задачу. Pimp Juice IT 5 лет назад 0
@Sujitkar Последний комментарий сейчас и будет ждать, чтобы услышать от вас .... В соответствии с этим снимком экрана https://i.imgur.com/3chEhdJ.png вы можете изменить «Значения» зеленой секции № 1, но сделать не изменяйте ничего с красным разделом # 2, и `PAUSE` с маленькой оранжевой линией не является обязательным, поэтому либо удалите строку полностью, либо оставьте как есть. Удачи! Pimp Juice IT 5 лет назад 0
@Sujitkar Какой статус у этого? Pimp Juice IT 5 лет назад 0

Похожие вопросы