Lote do Windows: chamar mais de um comando em um loop FOR?


124

É possível no arquivo em lotes do Windows chamar mais de um comando em um único FOR loop? Digamos, por exemplo, que eu queira imprimir o nome do arquivo e depois excluí-lo:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

Eu sei que nesse caso eu poderia resolvê-lo fazendo dois loops FOR distintos: um para mostrar o nome e outro para excluir o arquivo, mas é possível fazê-lo apenas em um loop?

Respostas:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

2
Na verdade, acho que os parênteses são desnecessários. for %i in (1 2 3) do echo %i & echo fooimprime o que eu esperaria: "1", "foo", "2", "foo", "3", "foo" (em linhas separadas).
bk1e

Isso não deveria ser &&melhor do que &?
JWW

9
@jww &&falhará se o primeiro comando falhar, &executará o segundo comando independentemente.
yyny

Se esta solução DOcometer um erro de sintaxe, verifique se você tem um parênteses sem escape entre os parênteses. Você pode escapar deles acrescentando um ^a eles.
Константин Ван

199

Usar &é bom para comandos curtos, mas essa linha única pode demorar muito, muito rapidamente. Quando isso acontecer, mude para a sintaxe de várias linhas.

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

Colocação (e )assuntos. Os colchetes depois DOdevem ser colocados na mesma linha, caso contrário, o arquivo em lotes estará incorreto.

Veja if /?|find /V ""para detalhes.


12
Esta solução parece limpa e legível. Eu também avisaria a qualquer programador que use esta solução que o colchete após o DONÃO deve ser colocado na próxima linha, caso contrário, ele freia o arquivo em lotes. No código, quando escrevo um loop for, geralmente coloco o colchete na {próxima linha.
Marco Demaio

2
Também - ser cauteloso se qualquer um dos seus comandos aninhados ter colchetes em (por exemplo, algo como "eco Algo algo (outra coisa)" EDIT: ah, ver a resposta de bk1e :)
Tim Barrass

31

SilverSkin e Anders estão corretos. Você pode usar parênteses para executar vários comandos. No entanto, você deve garantir que os próprios comandos (e seus parâmetros) não contenham parênteses. cmdavidamente procura o primeiro parêntese de fechamento, em vez de manipular conjuntos aninhados de parênteses normalmente. Isso pode fazer com que o restante da linha de comando falhe na análise, ou pode fazer com que alguns dos parênteses sejam passados ​​para os comandos (por exemplo DEL myfile.txt)).

Uma solução alternativa para isso é dividir o corpo do loop em uma função separada. Observe que você provavelmente precisará pular o corpo da função para evitar "cair" nele.

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF

3
Enquanto estamos no tópico,% X nunca está correto ao lidar com nomes de arquivos, sempre use "% ~ X" (no seu exemplo aqui, você pode usar o% * na subfunção provavelmente)
Anders

1
Esse é realmente um bom ponto. Um bom exemplo de um caminho que demonstra os dois problemas é C:\Program Files (x86).
bk1e
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.