Como executo comandos em arquivos em várias pastas?

Como executo comandos em arquivos em várias pastas?

Estou tentando descobrir uma maneira de executar comandos em vários arquivos que existem em várias pastas. Pelo que entendi, um forloop é a melhor maneira de fazer isso no CMD (estou usando o Windows). Porém, estou enfrentando alguns problemas e usarei uma das operações que preciso fazer como exemplo.

Para este comando específico, estou tentando criar pastas para vários arquivos, dentro de várias pastas. Aqui está um visual:

Folder A  
    File 1.avi  
    File 2.avi  
Folder B  
    File 3.avi  
    File 4.avi

Fiz algumas pesquisas e encontrei este comando:

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

Do qual eu desmancheiaqui. Isso está quase certo - cria uma pasta para cada arquivo contido em várias pastas. O problema é que preciso que essas novas pastas estejam contidas nas mesmas pastas dos arquivos. Este comando específico colocaria as novas pastas no lugar das pastas originais, em vez de dentro delas.

Alguém tem alguma idéia? Qualquer ajuda seria apreciada. Obrigado.

Responder1

  1. Uma técnica de depuração padrão é inserir o echocomando em scripts e até mesmo em comandos compostos/complexos. Se você fizer

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

    você obterá a saída

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

    Notas:

    • O@impede os echocomandoseles mesmosda exibição, então você vê apenas a saída deles.
    • "delims=…"informa for como analisar as linhas de saída do dir *.avi /b /scomando. Não sei por que a resposta que você vinculou sugere "delims=*". Mas o comportamento padrão é separar as linhas em espaços, portanto, se seus nomes de diretório e/ou arquivo contiverem espaços (como você indicou), você deverá usar "delims="(especificando que não há delimitadores) para que isso funcione.
  2. Se você digitar for /?ou help for, obterá documentação sobre o forcomando. Na quinta página, você verá

    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 …
    

    o que explica por que %~navocê está obtendo apenas o nome dos *.aviarquivos cujos nomes completos estão em %a. Agora tente

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

    e você vai conseguir

    "o_diretório_atual\Pasta A\"
    "o_diretório_atual\Pasta A\"
    "o_diretório_atual\Pasta B\"
    "o_diretório_atual\Pasta B\"

    Do que podemos concluir que você deseja fazer

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

    para criar os diretórios file 1e em , e os diretórios e em . E, como aponta @dave_thompson_085, você pode combinar em .file 2Folder Afile 3file 4Folder B%~pa%~na%~pna

informação relacionada