Equivalente em lote de backticks Bash

Respostas:

53

Você pode fazer isso redirecionando a saída para um arquivo primeiro. Por exemplo:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
zvrba
fonte
16
Requer que você encontre um local onde tenha acesso de gravação para armazenar o arquivo temporário; você tem que limpar depois de você mesmo; este exemplo só permite que você leia a primeira linha de entrada. Para todos os efeitos práticos, a for /fvariante é muito melhor.
Joey
@grawity - junto com%random%
bacar
1
@joey Ele lê cada linha, mas como concatenar a um argumento de linha de comando em um único comando.
user877329
como ele lida com nova (s) linha (s)?
andrewrk de
103

Você pode obter uma funcionalidade semelhante usando scripts cmd.exe com o for /fcomando:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Sim, é meio não óbvio (para dizer o mínimo), mas é o que está lá.

Veja for /?os detalhes sangrentos.

Nota lateral: Eu pensei que para usar " echo" dentro dos crases em um for /fcomando " " precisaria ser feito usando " cmd.exe /c echo Test" já que echoé um comando interno para cmd.exe, mas funciona de forma mais natural. Os scripts de lote do Windows sempre me surpreendem de alguma forma (mas geralmente não de um jeito bom).

Michael Burr
fonte
2
Normalmente, você precisa fazer isso ao executar shell-builtins de programas externos que não geram um shell automaticamente. system()Ou seja, C's estava bem, iirc, já que ele inicia um shell em qualquer caso, mas o .NET Process.Startprecisa invocar explicitamente o shell. Algo assim, iirc. Em todo caso, considero que esta é a melhor resposta do que a aceita :-)
Joey
2
As opções para fornão machucar, mas confundir o problema. E sobre isso:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas
9
Use um único% em vez de %% ao executar o mesmo na linha de comando, em vez de em um script em lote.
jsears de
2
Não parece funcionar bem com tubulação, por exemplo, o operador ">". Mas por outro lado, isso é incrível. A menos que este seja apenas um problema% vs %% que tive.
Jonathan,
3
@Evan: tokens=*é importante. Caso contrário, se o resultado do comando incluir espaços, apenas a primeira palavra será gerada. Executar este no prompt: for /f %a in ('"echo foo bar"') do echo "%a". Vai ser impresso "foo".
Dan Dascalescu
29

Leia a documentação do comando "for": for /?

Infelizmente, não estou conectado ao Windows para verificar, mas acho que algo assim pode se aproximar do que você deseja:

for /F %i in ('echo Test') do my_command %i
Weeble
fonte
6
No caso de alguém tropeçar nisso, quando o comando é executado a partir de um arquivo em lote (* .bat), ambas as variáveis% i precisam ter sinal de porcentagem duplo: %% i.
mgouin
3

Você sempre pode executar o Bash dentro do Windows. Eu faço isso o tempo todo com o MSYS (muito mais eficiente do que o Cygwin ).

davr
fonte
Infelizmente, o MSYS quase não é mantido agora, para obter um bash atualizado, você precisa instalá-lo separadamente
Ed Randall
1
BusyBox é ainda menor (~ 432 KB). Não um Bash completo, apenas Ash. Obtenha a porta não oficial do Windows aqui: frippery.org/busybox
Martin
3

Talvez eu esteja bagunçando a sintaxe do for /fmétodo padrão , mas quando coloco um comando muito complexo envolvendo && e | dentro das crostas no limite do for /f, causa problemas. Uma pequena modificação do usual é possível para lidar com um comando de complexidade arbitrária:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

Colocando primeiro seu comando completo e complexo em uma variável e, em seguida, colocando uma referência à variável no limite em vez de colocar o comando complexo diretamente no limite do loop for, você pode evitar problemas de interpretação de sintaxe. Atualmente, se eu copiar o comando exato que defini para a VVvariável no exemplo acima onde ele é usado %VV%, isso causará erros de sintaxe.

mtalexan
fonte
1
Isso não funcionou para mim, mas descobri que você pode fazer piping diretamente dentro do comando for se escapar com um carat (^): for / f "usebackq tokens = *" %% a in (`command ^ | command`) do command %% a
Heptite
O escape do @Heptite Card não funcionou para mim, mas colocar a linha de comando entre aspas sim.
Alexandr Zarubkin,
@Heptite No meu caso, eu não conhecia a série de comandos que precisava executar de antemão, eles foram extraídos de um arquivo em um caso e passados ​​em outro. Com o escape, você precisa saber quantas vezes escapar do comando com base em quantos intérpretes ele vai executar e, em meus casos de uso, esse não era um número consistente de intérpretes.
mtalexan