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). 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
Uma técnica de depuração padrão é inserir o
echo
comando em scripts e até mesmo em comandos compostos/complexos. Se você fizerfor /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 osecho
comandoseles mesmosda exibição, então você vê apenas a saída deles. "delims=…"
informafor
como analisar as linhas de saída dodir *.avi /b /s
comando. 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.
- O
Se você digitar
for /?
ouhelp for
, obterá documentação sobre ofor
comando. 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
%~na
você está obtendo apenas o nome dos*.avi
arquivos cujos nomes completos estão em%a
. Agora tentefor /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 1
e em , e os diretórios e em . E, como aponta @dave_thompson_085, você pode combinar em .file 2
Folder A
file 3
file 4
Folder B
%~pa%~na
%~pna