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.

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.


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.


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 "<".


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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.