Как выполнить команды для файлов в нескольких папках?

Как выполнить команды для файлов в нескольких папках?

Я пытаюсь найти способ выполнения команд для нескольких файлов, которые существуют в нескольких папках. Насколько я понимаю, цикл 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. Стандартная техника отладки — вставка 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="(указав, что разделителей нет), чтобы это работало.
  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"
    

    и вы получите

    "текущий_каталог\Папка А\"
    "текущий_каталог\Папка А\"
    "текущий_каталог\Папка 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.

Связанный контент