Defina o valor de uma variável com o resultado de um comando em um arquivo de lote do Windows

99

Ao trabalhar em um ambiente Bash , para definir o valor de uma variável como resultado de um comando, geralmente faço:

var=$(command -args)

onde varé a variável definida pelo comando command -args. Posso então acessar essa variável como $var.

Uma maneira mais convencional de fazer isso, compatível com quase todos os shell Unix, é:

set var=`command -args`

Dito isso, como posso definir o valor de uma variável com o resultado de um comando em um arquivo de lote do Windows ? Eu tentei:

set var=command -args

Mas acho que varé definido como command -argsem vez da saída do comando.

Francis
fonte

Respostas:

63

Para fazer o que Jesse descreve , a partir de um arquivo em lote do Windows, você precisará escrever:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Mas, em vez disso, sugiro usar Cygwin em seu sistema Windows se você está acostumado com scripts do tipo Unix.

nik
fonte
19
use for /f "delims=" %a in ('ver') do @set foobar=%ano prompt de comando. usar for /f "delims=" %%a in ('ver') do @set foobar=%%aem arquivos de script
georg
Uma alternativa leve é ​​o Gnu no Windows ( github.com/bmatzelle/gow/wiki ). Basta abrir um prompt de comando e executar bash. Então você pode escrever comandos bash. Você também pode executar scripts bash.
Nathan
4
Observe que se o seu comando inclui um pipe, você precisa escapar dele com um acento circunflexo, por exemplo: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ set foobar = %% a
yoyo
35

É preciso ter um pouco de cuidado, pois o comando batch do Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

não tem a mesma semântica que a instrução do shell Unix:

theValue=`command`

Considere o caso em que o comando falha, causando um erro.

Na versão shell do Unix, a atribuição a "theValue" ainda ocorre, qualquer valor anterior sendo substituído por um valor vazio.

Na versão em lote do Windows, é o comando "for" que trata o erro, e a cláusula "do" nunca é alcançada - portanto, qualquer valor anterior de "theValue" será retido.

Para obter mais semântica semelhante ao Unix no script de lote do Windows, você deve garantir que a atribuição ocorra:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Deixar de limpar o valor da variável ao converter um script Unix em lote do Windows pode ser uma causa de erros sutis.

Jonathan Headland
fonte
2
Obrigado por explicar a diferença sutil entre o Windows e * nix.
Jeroen Wiert Pluimers
3
Lembre-se também de escapar quaisquer caracteres especiais em command; por exemplo: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart
@Bill_Stewart você acabou de salvar meu dia, por um momento achei que era muito mais difícil atribuir a saída de comandos canalizados a uma variável
MrBrody
19

Veja como faço isso quando preciso dos resultados de uma consulta de banco de dados em meu arquivo em lote:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

A chave está na linha 2: "set / p" define o valor de "result" para o valor da primeira linha (apenas) em "__query.tmp" por meio do operador de redirecionamento "<".

muito tempo livre
fonte
14

A única maneira que vi acontecer é se você fizer isso:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver é o comando de versão para Windows e em meu sistema produz:

Microsoft Windows [Version 6.0.6001]

Fonte

Jesse Dearing
fonte
0
Set "dateTime="
For /F %%A In ('powershell get-date -format "{yyyyMMdd_HHmm}"') Do Set "dateTime=%%A"
echo %dateTime%
pause

insira a descrição da imagem aqui Documentos oficiais da Microsoft para forcomando

alchi baucha
fonte