Como executo comandos em arquivos em várias pastas?

0

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

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

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

Eu fiz algumas pesquisas por aí e descobri este comando:

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

Que eu descartei junto de aqui . Isso está quase certo - cria uma pasta para cada arquivo contido nas várias pastas. O problema é que eu preciso que essas novas pastas estejam contidas nas mesmas pastas que os arquivos. Esse comando específico colocaria as novas pastas no local como as pastas originais, e não dentro delas.

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

    
por OTTERMATIC 30.01.2016 / 06:05

1 resposta

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

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

    você receberá a saída

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

    Notas:

    • O @ impede a exibição dos comandos echo , então você vê apenas sua saída.
    • "delims=…" informa for como analisar as linhas de saída do comando dir *.avi /b /s . Não sei por que a resposta à qual você vinculou sugere "delims=*" . Mas o comportamento padrão é separar as linhas nos espaços, então, se o seu diretório e / ou nomes de arquivos contiverem espaços (como você indicou), você deve usar "delims=" (especificando que não há delimitadores) para que isso funcione.
  2. Se você digitar for /? ou help for , você obterá documentação sobre o comando for . Abaixo 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 …
                             ︙ 
    

    que explica por que %~na está obtendo apenas o nome do arquivo dos arquivos *.avi cujos nomes completos estão em %a . Agora tente

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

    e você receberá

    "the_current_directory\Folder A\"
    "the_current_directory\Folder A\"
    "the_current_directory\Folder B\"
    "the_current_directory\Folder B\"

    A partir do qual podemos concluir que você quer fazer

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

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

por 30.01.2016 / 07:10