Я предлагаю следующий код пакетного файла для этой задачи:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFolder=%LocalAppData%\Packages\FOLDER1\FOLDER2"
set "TargetFolder=C:\hello"
for /F "delims=" %%I in ('dir "%SourceFolder%\*robotknow*" /A-D /B /S 2^>nul') do %SystemRoot%\System32\xcopy.exe "%%~dpI*" "%TargetFolder%\" /C /E /H /K /Q /R /Y >nul
endlocal
Команда FOR с опцией /F
запускает отдельный командный процесс с cmd.exe /C
(точнее * 1008)*) в фоновом режиме для запуска командной строки:
dir "C:\Users\{username}\AppData\Local\Packages\FOLDER1\FOLDER2\*robotknow*" /A-D /B /S 2>nul
DIR выводит для обработки STDOUT фонового командного процесса
- простоимена всех файлов , совпадающих с шаблоном подстановки
*robotknow*
из-за опции /A-D
(атрибут не каталог) - даже в файле со скрытым атрибутом, установленным из-за использования опции
/A
ине исключая атрибут скрытый - в голом формате из-за опции
/B
- с полным указанием пути из-за опции
/S
- , найденной в указанном каталоге или любом подкаталоге, также потому, чтоопции
/S
.
Возможно, что DIR не найдет ни одной записи файловой системы, соответствующей этим критериям, и в этом случае выводит сообщение об ошибке для обработки STDERR.Это сообщение об ошибке подавляется путем перенаправления его на устройство NUL .
. Прочтите статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul
.Оператор перенаправления >
должен быть экранирован с помощью символа вставки ^
в FOR командной строке, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir
в отдельном командном процессе, запущенном в фоновом режиме.
FOR с параметром /F
захватывает все выходные строки для обработки STDOUT из запущенногоКоманда обрабатывает и обрабатывает их построчно после того, как запущенный cmd.exe
завершился сам.
FOR игнорирует пустые строки, которые здесь не встречаются. FOR по умолчанию игнорирует также все строки, начинающиеся с точки с запятой, поскольку eol=;
используется по умолчанию для символа конца строки.Но полное имя файла, состоящее из полного пути к файлу, имени файла и расширения файла, не может начинаться с ;
, поэтому в этом случае можно сохранить опцию конца строки по умолчанию. FOR разбивает строки по умолчанию на подстроки с использованием обычного пробела и символа горизонтальной табуляции в качестве разделителей строк и назначает только первую разделенную пробелом / табуляцией подстроку указанной переменной цикла.Такое поведение разделения строк здесь нежелательно, поскольку путь к файлу может содержать символ пробела.По этой причине опция delims=
используется для определения пустого списка разделителей, который запрещает разделение строк.
Итак, FOR присваивает указанной и регистрозависимой интерпретируемой переменной цикла I
полное имя файла найдено и выведено DIR и запускает команду XCOPY .
XCOPY выполняется с источником, который является полным квалифицированным путемнайденного файла, на который ссылается %%~dpI
, всегда заканчивающегося обратной косой чертой, объединенной с подстановочным знаком *
, а целевой каталог является целевой папкой C:\hello
.
Добавленная обратная косая черта в конце пути к каталогу назначения делает его на 100% яснымдля XCOPY , что местом назначения является каталог, а не файл, что предотвращает запрос, если место назначения означает каталог или файл.\
в конце также делает ненужным использование опции /I
, а XCOPY создает всю целевую структуру каталогов, если необходимо.
Другие опции XCOPY предназначены для действительнокопирование всех файлов, включая файлы со скрытым атрибутом, установленным в каталог, содержащий файл, соответствующий шаблону подстановки *robotknow*
со всеми подкаталогами, включая пустые подкаталоги, в каталог назначения с сохранением атрибутов, включая атрибут только для чтения.
Для понимания используемых команди как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
dir /?
echo /?
endlocal /?
set /?
setlocal /?
xcopy /?
См. Также список предопределенных переменных среды Windows .