Archivos por lotes de Windows: ¿cómo establecer una variable con el resultado de un comando?

En un entorno de bash, suelo hacerlo:

var=$(command -args) 

y yo uso $var con su valor establecido como resultado del comando. Lo mismo ocurre con un método más convencional

 set var=`command -args` 

compatible en casi todos los shell de Unix.

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

 set var=command -args 

pero solo obtengo la cadena “command-args”.

Para hacer lo que Jesse describe a partir de un archivo por lotes necesitarás 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 tipo Unix.

Uno tiene que ser algo cuidadoso, ya que el comando de lote de Windows:

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

no tiene la misma semántica que la statement de shell de Unix:

 theValue=`command` 

Considere el caso donde el comando falla, causando un error.

En la versión de shell de Unix, la asignación a “theValue” todavía ocurre, cualquier valor anterior se reemplaza con un valor vacío.

En la versión por lotes 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 tipo Unix en el script de proceso por lotes de Windows, debe asegurarse de que la tarea tenga lugar:

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

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

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 "resultado" en el valor de la primera línea (solamente) en "__query.tmp" a través del operador de redirección "<".

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