Отсутствует подстановочный знак, чтобы этот пакетный процесс выполнял поиск во всех подпапках?

Отсутствует подстановочный знак, чтобы этот пакетный процесс выполнял поиск во всех подпапках?

Я собирал куски скриптов со всего интернета, создавая что-то для поиска по всем папкам в одной родительской папке, находя определенные файлы и копируя их в новое место. (У нас есть каталог с бесконечным количеством пустых и занятых папок, и мы пытаемся найти несколько файлов без ручного поиска)

Пока что скрипт работает, но только если именованные файлы (из документа Names.txt) находятся непосредственно в родительской папке (...\source). Если они находятся внутри любой из папок родительской папки (...\source\folder1\folder2\etc), они не ищутся и ничего не получается. Что я упускаю?

@echo off
pushd C:\Users\username\Desktop\TestBatches
set /p SourceFolder=Enter the path of source folder and press 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type Names.txt') do xcopy /hrkvy "%SourceFolder%\%%a" ".\destination"
popd
pause

Мне нужно ввести подстановочный знак в командной строке при вводе исходного пути? Или мне нужно ввести что-то в пакет, что автоматически сделает это?

Я немного запутался. Спасибо за помощь!

решение1

Я собираюсь привести вас прямо к некоторым продвинутым концепциям пакетной обработки.
В следующем примере я использую пакетную обработкуфункциидля выполнения этой задачи. Это не самый эффективный способ достичь цели, но он покажет вам, какие вещи выМОЖЕТделаю. Я все еще очень устал, поэтому это решение может быть глупым (но оно работает)

Даже если вы не пойдете по этому пути, возможно, "dir /s /b МАСКА ФАЙЛА" — это то, что вы искали.

@echo off
:: This assumes that this batch is in the same folder as Names.txt and the .\destination folder
:: This batch DOES NOT check things it should like the existence of %SourceFolder% or if .\destination even exists
Set ThisDir=%~DP0
Set DestinationDir=%ThisDir%\destination
Set NamesFile=%ThisDir%\Names.txt
Set /p SourceFolder=Enter the path of source folder and press [Enter]:
for /f "delims=" %%a in ('type %NamesFile%') do call :SearchName "%%a"
pause
goto :EOF

:: ----------------------------------------------------------------
:SearchName
pushd %SourceFolder%
for /f "delims=" %%f in ('dir /s /b %1') do call :FoundFile "%%f"
popd
goto :EOF

:: ----------------------------------------------------------------
:FoundFile
xcopy /hrkvy "%1" "%DestinationDir%"
goto :EOF

Первый цикл for не делает ничего, кроме вызова функции:ИмяПоискадля каждого имени в текстовом файле.

The:ИмяПоискаФункция переключается на каталог, указанный "Set /p" и выполняет "dir /s /b NAME_PASSED_FROM_TEXT_FILE". Она перекачивает полученные строки (найденные файлы) в:НайденныйФайлфункция.

The:НайденныйФайлфункция копирует переданный ей файл.

Связанный контент