Я пытаюсь найти способ выполнения команд для нескольких файлов, которые существуют в нескольких папках. Насколько я понимаю, цикл for
— лучший способ сделать это в CMD (я использую Windows). Однако у меня возникли некоторые проблемы, и я буду использовать одну из операций, которую мне нужно сделать, в качестве примера.
Для этой конкретной команды я пытаюсь создать папки для нескольких файлов внутри нескольких папок. Вот визуальное представление:
Folder A
File 1.avi
File 2.avi
Folder B
File 3.avi
File 4.avi
Я поискал немного и пришел к такой команде:
for /f "delims=*" %a in ('dir *.avi /b /s') do md "%~na"
Которые я собрал изздесь. Это почти правильно — он создает папку для каждого файла, содержащегося в нескольких папках. Проблема в том, что мне нужно, чтобы эти новые папки содержались в тех же папках, что и файлы. Эта конкретная команда поместит новые папки в то же место, что и исходные папки, а не в них.
Есть у кого-нибудь идеи? Любая помощь будет оценена по достоинству. Спасибо.
решение1
Стандартная техника отладки — вставка
echo
команды в скрипты и даже составные/комплексные команды. Если вы это сделаетеfor /f "delims=*" %a in ('dir *.avi /b /s') do @echo md "%~na"
вы получите результат
"file 1" "file 2" "file 3" "file 4"
Примечания:
- The
@
предотвращаетecho
командысами себяот отображения, поэтому вы видите только их вывод. "delims=…"
рассказываетfor
, как анализировать строки вывода командыdir *.avi /b /s
. Я не знаю, почему ответ, на который вы ссылаетесь, предлагает"delims=*"
. Но поведение по умолчанию заключается в том, чтобы разбивать строки пробелами, поэтому, если ваши имена каталогов и/или файлов содержат пробелы (как вы указали), вы должны использовать"delims="
(указав, что разделителей нет), чтобы это работало.
- The
Если вы введете
for /?
илиhelp for
, вы получите документацию поfor
команде. Внизу на пятой странице вы увидитеIn addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") ︙ %~pI - expands %I to a path only %~nI - expands %I to a file name only ︙ The modifiers can be combined to get compound results … ︙
что объясняет, почему
%~na
вы получаете только имя файла,*.avi
полные имена которого находятся в%a
. Теперь попробуйтеfor /f "delims=" %a in ('dir *.avi /b /s') do @echo md "%~pa"
и вы получите
"текущий_каталог\Папка А\" "текущий_каталог\Папка А\" "текущий_каталог\Папка B\" "текущий_каталог\Папка B\"
Из чего мы можем сделать вывод, что вы хотите сделать
for /f "delims=" %a in ('dir *.avi /b /s') do md "%~pa%~na"
для создания каталогов
file 1
иfile 2
вFolder A
, а также каталоговfile 3
иfile 4
вFolder B
. И, как указывает @dave_thompson_085, вы можете объединить%~pa%~na
в%~pna
.