Файл bat, чтобы рекурсивно пройти и найти определенный тип файла - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь рекурсивно пройти по каталогу и найти в нем исполняемые файлы.

Это структура папок

C:\MyCave\iso\SDG\cmpdir

---------------\FolderA
------------------abc.txt
---------------\FolderB
------------------def.exe
---------------\FolderC
------------------ghi.dll

Ниже приведен пример моей летучей мыши.

set f="C:\MyCave\iso\SDG\cmpdir\test-recur"
for /r %%f in ("*.exe") do if exist %%f echo %%f

Хотя он работает и выводит exe-файлы в C:\MyCave\iso\SDG\cmpdir, но я хочу перечислить exe-файлы, присутствующие только в каталоге C:\MyCave\iso\SDG\cmpdir\test-recur.

Это мой текущий вывод.

C:\MyCave\iso\SDG\cmpdir>exeRecur.bat

C:\MyCave\iso\SDG\cmpdir>set f="C:\MyCave\iso\SDG\cmpdir\test-recur"

C:\MyCave\iso\SDG\cmpdir>for /R %f in ("*.exe") do if exist %f echo %f

C:\MyCave\iso\SDG\cmpdir>if exist C:\MyCave\iso\SDG\cmpdir\cp.exe echo C:\MyCave\iso\SDG\cmpdir\cp.exe
C:\MyCave\iso\SDG\cmpdir\cp.exe

C:\MyCave\iso\SDG\cmpdir>if exist C:\MyCave\iso\SDG\cmpdir\dirB\Abcd.exe echo C:\MyCave\iso\SDG\cmpdir\dirB\Abcd.exe
C:\MyCave\iso\SDG\cmpdir\dirB\Abcd.exe

C:\MyCave\iso\SDG\cmpdir>if exist C:\MyCave\iso\SDG\cmpdir\test-recur\2\def.exe echo C:\MyCave\iso\SDG\cmpdir\test-recur\2\def.exe
C:\MyCave\iso\SDG\cmpdir\test-recur\2\def.exe

C:\MyCave\iso\SDG\cmpdir>if exist C:\MyCave\iso\SDG\cmpdir\wspace\defg.exe echo C:\MyCave\iso\SDG\cmpdir\wspace\defg.exe
C:\MyCave\iso\SDG\cmpdir\wspace\defg.exe

Я знаю, что где-то есть небольшая ошибка. Запрос вашей помощи в ее решении.


Основываясь на ответе Герхарда и sst, я изменил свой скрипт следующим образом.

set rootFolder=%1
set destFolder=%2
for /r %rootFolder% %%f in ("*.exe") do if exist %%f move %%f %destFolder%

Я передаю аргументы командной строки для bat, как это. ..

exeRecur.bat "C:\MyCave\iso\SDG\cmpdir\test-recur" "C:\MyCave\iso\SDG\cmpdir\dirA"

Таким образом избегается жесткое кодирование путей.

С уважением

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Хорошо, значит, вы устанавливаете переменную:

set f="C:\MyCave\iso\SDG\cmpdir\test-recur"

Во-первых, это плохая практика - устанавливать переменные с одним символом, но более важно то, как вы заключаете их в двойные кавычки. Это должно быть от начала переменной до конца значения.

set "f=C:\MyCave\iso\SDG\cmpdir\test-recur"

Однако реальная проблема заключается в том, что вы никогда не сообщаете циклу for /r, где рекурсивно выполнять поиск.

set "mypath=C:\MyCave\iso\SDG\cmpdir\test-recur"
for /r "%mypath%" %%f in (*.exe) do echo %%~f
1 голос
/ 07 ноября 2019

Вы забыли указать аргумент 'root path' для FOR /R, поэтому он начинает перечисление с текущего каталога.

Вы должны использовать другое имя для переменной среды, чтобы избежать путаницы с параметром FOR %%f.

set "RootFolder=C:\MyCave\iso\SDG\cmpdir\test-recur"
for /r "%RootFolder%" %%f in (*.exe) do echo %%f

Вам также следует использовать расширенный синтаксис команды set:set "var=value" и используйте "%var%" везде, где необходимо заключить в кавычки.

Поскольку вы используете подстановочный знак *.exe, нет необходимости в if exist в FOR /R, поскольку он будет перечислять только существующие файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...