2009-05-20 17 views
84

En un entorno de fiesta por lo general lo hago:Windows batch files: ¿Cómo establecer una variable con el resultado de un comando?

var=$(command -args) 

y la utilizo $var con su valor enchufar como el resultado del comando. Lo mismo ocurre a una más convencional

set var=`command -args` 

compatible en casi todos los shell UNIX.

¿Cómo podría definir una variable en un archivo Windows Bat como ese? He intentado

set var=command -args 

pero solo me dan cuerda del "comando -args".

Respuesta

7

La única forma que he visto hacer es si usted hace esto:

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

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

Microsoft Windows [Version 6.0.6001] 

Source

54

Para hacer lo que Jesse describe a partir de un archivo por lotes, deberá escribir

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

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

+15

use 'for/f" delims = "% a in ('ver') do @set foobar =% a' en el símbolo del sistema. use 'for/f" delims = "%% a in ('ver') do @set foobar = %% a' en archivos de script – georg

+0

Una alternativa ligera es Gnu On Windows (https://github.com/bmatzelle/gow)/wiki). Simplemente abre un símbolo del sistema y ejecuta 'bash'. Entonces puedes escribir comandos bash. También puede ejecutar scripts bash. – Nathan

+2

Tenga en cuenta que si su comando incluye una tubería, entonces necesita escapar de ella con un símbolo de intercalación, por ejemplo: para/f "delims =" %% a in ('echo foobar^| sed -es/foo/fu /') do @set foobar = %% a – yoyo

15

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

sqlplus -S schema/[email protected] @query.sql> __query.tmp 
set /p result=<__query.tmp 
del __query.tmp 

La clave está en la línea 2: "set/p" define el valor de "número" en el valor de la primera línea (solo) en "__query.tmp" a través del operador de redirección "<".

28

Uno tiene que ser un poco cuidadoso, 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 shell de Unix:

theValue=`command` 

Considérese el caso en que el comando falla , causando un error

En la versión de shell de Unix, todavía se asigna a "theValue", reemplazando cualquier valor anterior por un valor vacío.

En la versión del lote de Windows, es el comando "para" 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 de tipo Unix en el archivo por lotes de Windows, debe asegurarse de que la asignación se lleva a cabo:

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

El no poder borrar el valor de la variable al convertir una secuencia de comandos de Unix a Windows por lotes puede ser una causa de errores sutiles.

+2

Gracias por explicar la sutil diferencia entre Windows y * nix. –

+1

Recuerde también escapar de cualquier carácter especial en 'comando'; e.g .: 'for/f" delims = "%% a in ('command1^| command2') establece VAR = %% a'. –

Cuestiones relacionadas