Я пытаюсь выяснить способ выполнения команд для нескольких файлов, которые существуют в нескольких папках. Из того, что я понимаю, цикл 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 ответ1

1
  1. Стандартный метод отладки - вставить команду echo в сценарии и даже сложные / сложные команды.  Если вы делаете

    for /f "delims=*" %a in ('dir *.avi /b /s') do @echo md "%~na"
    

    вы получите выход

    "file 1"
    "file 2"
    "file 3"
    "file 4"
    

    Заметки:

    • Символ @ запрещает отображение самих echo команд, поэтому вы видите только их вывод.
    • "delims=…" говорит for том, как анализировать строки вывода из команды dir *.avi /b /s .  Я не знаю, почему ответ, на который вы ссылались, предлагает "delims=*" .  Но поведение по умолчанию - разбивать строки на пробелы, поэтому, если имена каталогов и / или файлов содержат пробелы (как вы указали), вы должны использовать "delims=" (указывая, что разделителей нет), чтобы это работало ,
  2. Если вы введете 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"
    

    и вы получите

    " the_current_directory\ Папка A\" " the_current_directory\ Папка A\" " the_current_directory\ Папка B\" " the_current_directory\ Папка 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .