Passando a saída de um comando do DOS como argumentos para outro comando?

2

No linux, isso leva um comando e passa sua saída (stdout) para outro:

echo 'ls'

Qual é o equivalente Windows / cmd / lote?

    
por ripper234 09.12.2012 / 17:06

2 respostas

12

cmd.exe oferece um recurso de substituição de comando rudimentar usando backticks, mas somente via for loop com a opção /f usebackq . No entanto, é bastante complicado se comparado ao que um shell Unix faria, já que seu comportamento padrão é pegar apenas a primeira palavra de cada linha de saída do filho e só assim você pode iterar sobre eles, não para poder colar todos eles de uma vez na linha de comando. (Você pode ajustar o comportamento com a opção delims ). Veja um exemplo:

for /f usebackq %F in ('dir /w s*c') do echo %F

Se você quiser uma substituição de comando genuína no estilo Unix, você precisará de um shell Unix genuíno, por exemplo, Cygwin bash ou o meu próprio (comercial ) Shell Hamilton C .

    
por 09.12.2012 / 18:36
0

Exemplo de saída de eco de dir (use aspas simples, não backtick!):

echo off & for /f "delims=" %A in('dir') do echo %A

No modo interativo, você precisa digitar echo on e pressionar Enter para sair. Se você tiver certeza de que o loop só é executado uma vez (ou seja, a saída de ('xxx') é linha única), você pode direcionar o echo on no comando.

echo off & for /f "delims=" %A in('set /a 0x3DE1') do net helpmsg %A & echo on

Por motivo desconhecido, ('set /a 0x3DE1') não pode fazer como 'set /a c=0x3DE1' , mesmo que set /a c=0x3DE1 funcione como um único comando.

Exemplo de echo hello world de 'echo hello world' (aspas simples):

echo off & for /f "delims=" %A in('echo hello world') do echo %A

Exemplo de echo hello world de "" (string literal):

echo off & for /f "delims=" %A in("hello world") do echo %A

Acima da sintaxe %A é para o modo interativo, você precisa de duplo % no arquivo de lote, por exemplo %%A

Tome cuidado se você fizer echo %A dentro do loop, imagine se uma das linhas da saída do comando chamar on , então existem 2 problemas:

[1] echo $A significa echo on que não ecoará em nada e será invisível. Só posso pensar em comparar o on para lidar com esse caso específico.

[2] echo $A significa echo on , que retornará a saída do prompt de comando; Você pode precisar adicionar echo off extra dentro do loop, por exemplo:

echo off & for /f "delims=" %A in('dir /b') do echo %A & echo off

Observe que os exemplos acima estão longe de serem equivalentes a '' , já que o argumento é executado linha por linha. Você pode criar este lote para tentar simular echo 'ls' (faça um loop e anexe todas as linhas em uma única variável separada por espaço e depois passe como argumento mais tarde):

@echo off
Setlocal EnableDelayedExpansion
set fls=
for /f "delims=" %%A in ('dir /b') do set fls=!fls! %%A
echo %fls% 
    
por 27.08.2017 / 02:07