Пакетная команда для проверки частичного имени файла, а затем переместить

Мне нужна командная команда, которая будет просматривать подпапки каталога и находить частичное имя файла. Если этот файл существует, переместите этот каталог, иначе оставьте его в покое.

У меня есть папка, полная фильмов:

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
Другие вопросы по тегам