Пакетная команда для проверки частичного имени файла, а затем переместить
Мне нужна командная команда, которая будет просматривать подпапки каталога и находить частичное имя файла. Если этот файл существует, переместите этот каталог, иначе оставьте его в покое.
У меня есть папка, полная фильмов:
D:\Movies\movie1\
\movie2\
\movie3\
В каждой папке с фильмом я хотел бы знать, загружен ли в нее трейлер, и если да, то переместите этот каталог в x:\movies
, Я говорю частичное имя файла, поскольку каждый файл трейлера будет включать название фильма с "-trailer
"добавлен в конец (например, The Interview (2014)-trailer
).
1 ответ
Давайте посмотрим на решение из Windows CLI (Интерпретатор командной строки) с ->
запросить с помощью индекса AZ командной строки Windows CMD и со следующим сценарием:
->tree d:\test\movies
D:\TEST\MOVIES
├───movie1
├───movie2
├───movie3
└───movie4
->tree d:\test\xmovies
D:\TEST\XMOVIES
No subfolders exist
->dir /B /S /A-D "d:\test\movies"
d:\test\movies\movie1\The View (2014)-trailer missing.rtf
d:\test\movies\movie2\The Interview (2014)-trailer.bat
d:\test\movies\movie2\The Interview (2014)-trailer.bmp
d:\test\movies\movie2\The Interview (2014)-trailer.txt
d:\test\movies\movie3\An Interview (2014)-trailer.bmp
Чтобы найти все эти файлы в MOVIES
подпапка с -trailer
добавляется в конец имени файла .
расширения файла:
->dir /B /S /A-D "d:\test\movies\*-trailer.*"
d:\test\movies\movie2\The Interview (2014)-trailer.bat
d:\test\movies\movie2\The Interview (2014)-trailer.bmp
d:\test\movies\movie2\The Interview (2014)-trailer.txt
d:\test\movies\movie3\An Interview (2014)-trailer.bmp
Чтобы получить только имена папок:
->for /F "tokens=*" %G in ('dir /B /S /A-D "d:\test\movies\*-trailer.*"') do @echo %~dpG
d:\test\Movies\movie2\
d:\test\Movies\movie2\
d:\test\Movies\movie2\
d:\test\Movies\movie3\
Но здесь movie2
появляется не раз! И, кроме того, move
Команда не разрешает исходный каталог с обратной косой чертой:
->move "D:\test\Movies\movie4\" "D:\test\xMovies\"
The system cannot find the file specified.
->move "D:\test\Movies\movie4" "D:\test\xMovies\"
1 dir(s) moved.
Поэтому нам нужно перейти с оболочки Windows (CLI) на пакетный сценарий. Создать файл 28167824.bat
(например, с notepad
и сохранить его в D:\bat\Stackru
папка):
@ECHO OFF >NUL
@SETLOCAL enableextensions disabledelayedexpansion
for /F "tokens=*" %%G in (
'dir /B /S /A-D "d:\test\movies\*-trailer.*"'
) do (
set "rawfolder=%%~dpG"
if exist "%%~dpG" call :moveDir
)
:endlocal
@ENDLOCAL
goto :eof
:moveDir
set "srcfolder=%rawfolder:~0,-1%"
`enter code here`echo move "%srcfolder%" "d:\test\xMovies\"
rem move "%srcfolder%" "d:\test\xMovies\"
goto :eof
Запустите этот пакетный скрипт, шаблон следующего move
Команды такие же, как в этом успешном move
Команда, упомянутая выше:
->D:\bat\Stackru\28167824
move "d:\test\Movies\movie2" "d:\test\xMovies\"
move "d:\test\Movies\movie2" "d:\test\xMovies\"
move "d:\test\Movies\movie2" "d:\test\xMovies\"
move "d:\test\Movies\movie3" "d:\test\xMovies\"
Бинго! Теперь мы могли бы удалить rem
до move "%srcfolder%" "d:\test\xMovies\"
, сохраните скрипт и запустите его:
->D:\bat\Stackru\28167824
move "d:\test\Movies\movie2" "d:\test\xMovies\"
1 dir(s) moved.
move "d:\test\Movies\movie3" "d:\test\xMovies\"
1 dir(s) moved.
И вот окончательная конфигурация, ср. стартовый сценарий:
->tree d:\test\movies
D:\TEST\MOVIES
└───movie1
->tree d:\test\xmovies
D:\TEST\XMOVIES
├───movie2
├───movie3
└───movie4