Мне нужна помощь в написании скрипта в cmd
Я нахожусь в папке, в которой есть подпапки, вам нужно выполнить поиск в этих подпапках (не углубляйтесь) и скопировать файлы, имя которых заканчивается на "_0001.png", в папку !! _ TEMP (эта папка находится в том месте, где запускается программа)
Вы можете помочь мне?
Это не работает:
for /R "%folder%" %%G in (*_0001.png) do copy "%%G" "%folder%\!!_TEMP\"
решение1
pushd "%folder%"
for /D %%D in (*) do copy "%%D\*_0001.png" "!!_TEMP"
popd
решение2
CMD — не моя сильная сторона, поэтому предложу свое решение на Powershell.
$content = Get-ChildItem .\Desktop\localtmp -Depth 1
foreach($file in $content){
if($file.Name -like "*_0001.png"){
$path = $file.DirectoryName + "\" + $file.Name
Copy-Item $path -Destination .\Desktop\anotherlocaltmp
}
}
вам просто нужно добавить свои пути
Надеюсь, поможет!
решение3
Это должно вам подойти:
@echo off
set "dir=C:\Your\Root\Folder"
set "tem=%dir%\!!_Temp"
for /d %%A in (*) do (
for %%B in (%%A\*_0001.png) do (
if not exist "%tem%\%%~nxB" copy /y "%%B" "%tem%\"
)
)
Чтобы сделать все более понятным и простым в изменении, мы устанавливаем две переменные — одну для вашей корневой папки ( dir
) и одну для !!_Temp
папки ( tem
) внутри вашего корня; это также предполагает, исходя из вашего вопроса, что вы запускаете файл .bat из корневой папки — если это не так, мы можем изменить путь в первом цикле for.
Первый цикл имеет for /d
который просматривает только папки верхнего уровня в вашем текущем каталоге, и для каждой итерации цикла эти папки верхнего уровня устанавливаются как параметр %%A
. Следующий цикл просматривает только файлы, соответствующие заданным нами критериям - то есть все, %%A
что заканчивается на _0001.png
- и устанавливает каждый из них как параметр %%B
. Команда в этом последнем цикле if not exist "%tem%\%%~nxB" copy /y "%%B" "%tem%\"
- мы включаем , if not exist
чтобы она не запускалась для файлов, которые уже были скопированы в !!_Temp
. Исходя из вашего вопроса, я не уверен, сталкивались ли вы когда-либо с несколькими файлами в нескольких подпапках с одинаковыми именами, но если это потенциальный случай, мы можем это обойти.
решение4
Эта одна строка цикла for должна работать. Она имеет те же переменные, что и те, которые вы используете.
for /f "delims==" %%G in ('dir "%folder%\*_0001.png" /s /b') do copy "%%G" "%folder%\!!_TEMP\"