Establecer el valor de una variable con el resultado de un comando en un archivo por lotes de Windows

98

Cuando trabajo en un entorno Bash , para establecer el valor de una variable como resultado de un comando, normalmente hago:

var=$(command -args)

donde vares la variable establecida por el comando command -args. Luego puedo acceder a esa variable como $var.

Una forma más convencional de hacer esto que es compatible con casi todos los shell de Unix es:

set var=`command -args`

Dicho esto, ¿cómo puedo establecer el valor de una variable con el resultado de un comando en un archivo por lotes de Windows ? He intentado:

set var=command -args

Pero encuentro que varestá configurado en command -argslugar de la salida del comando.

Francis
fuente

Respuestas:

62

Para hacer lo que describe Jesse , desde un archivo por lotes de Windows, deberá escribir:

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

Pero, en cambio, sugiero usar Cygwin en su sistema Windows si está acostumbrado a las secuencias de comandos de tipo Unix.

nik
fuente
19
utilizar for /f "delims=" %a in ('ver') do @set foobar=%aen el símbolo del sistema. uso for /f "delims=" %%a in ('ver') do @set foobar=%%aen archivos de script
georg
Una alternativa ligera es Gnu en Windows ( github.com/bmatzelle/gow/wiki ). Simplemente abra un símbolo del sistema y ejecútelo bash. Entonces puedes escribir comandos bash. También puede ejecutar scripts bash.
Nathan
4
Tenga en cuenta que si su comando incluye una tubería, entonces debe escapar con un signo de intercalación, por ejemplo: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ set foobar = %% a
yoyo
35

Hay que tener algo de cuidado, ya que el comando por lotes de Windows:

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

no tiene la misma semántica que la declaración del shell de Unix:

theValue=`command`

Considere el caso en el que el comando falla y provoca un error.

En la versión de shell de Unix, la asignación a "theValue" todavía se produce, y cualquier valor anterior se reemplaza por un valor vacío.

En la versión por lotes de Windows, es el comando "for" el que maneja el error y la cláusula "do" nunca se alcanza, por lo que se conservará cualquier valor anterior de "theValue".

Para obtener más semántica similar a Unix en el script por lotes de Windows, debe asegurarse de que se lleve a cabo la asignación:

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

No borrar el valor de la variable al convertir un script Unix a un lote de Windows puede ser una causa de errores sutiles.

Jonathan Headland
fuente
2
Gracias por explicar la sutil diferencia entre Windows y * nix.
Jeroen Wiert Pluimers
3
También recuerde escapar cualquier carácter especial en command; por ejemplo: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart
@Bill_Stewart me acaba de salvar el día, por un momento pensé que era mucho más difícil asignar la salida de los comandos canalizados a una variable
MrBrody
19

Así es como lo hago cuando necesito los resultados de una consulta de base de datos en mi archivo por lotes:

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

La clave está en la línea 2: "set / p" establece el valor de "result" en el valor de la primera línea (solo) en "__query.tmp" mediante el operador de redirección "<".

mucho tiempo libre
fuente
14

La única forma en que lo he visto es si haces esto:

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

ver es el comando de versión para Windows y en mi sistema produce:

Microsoft Windows [Version 6.0.6001]

Fuente

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

ingrese la descripción de la imagen aquí Documentos oficiales de Microsoft para forcomando

alchi baucha
fuente