2010-02-24 13 views
195

Necesito asignar la salida de un programa a una variable usando un archivo por lotes MS.Asignar salida de un programa a una variable

Así que en shell GNU Bash usaría VAR=$(application arg0 arg1). Necesito un comportamiento similar en Windows usando un archivo por lotes.

Algo así como set VAR=application arg0 arg1.

Respuesta

292

Una forma es:

application arg0 arg1 > temp.txt 
set /p VAR=<temp.txt 

Otra es:

for /f %%i in ('application arg0 arg1') do set VAR=%%i 

Tenga en cuenta que la primera % en %%i se utiliza para escapar de la % después de que se necesita y cuando se utiliza el código anterior en un archivo por lotes en lugar de en la línea de comandos. Imagínese, su test.bat tiene algo como:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i 
echo %datetime% 
+7

Este es un gran truco, me pregunto por qué no funciona con una tubería –

+11

Esto solo funciona para la salida que es una sola línea de texto (líneas subsiguientes omitidas después del primer salto de línea). – GroovyCakes

+14

@Machta la tubería debe ser escapada con un signo^delante de ella, dentro de la expresión en parens. Ejemplo: 'for/f" tokens = 3 "%% i in ('route print^| findstr" \ <0.0.0.0\> "') set set" myVar = %% i "' –

6

suponiendo que la salida de su aplicación es un código de retorno numérico, puede hacer lo siguiente

application arg0 arg1 
set VAR=%errorlevel% 
+2

Desafortunadamente, el resultado es una cadena. – initialZero

+0

bien. Lo guardaré para la posteridad, pero eche un vistazo al enlace de @ jdigital, que habla de la salida de tuberías a un archivo temporal. – akf

+0

La salida del programa a stdout y stderr es diferente de su valor de retorno entero. Un programa puede devolver un valor entero como en el ejemplo anterior, al mismo tiempo que envía una cadena a la consola (o lo redirige a un archivo u otro). No son mutuamente excluyentes y son dos conceptos diferentes. –

7

@OP, puede utilizar for loops para capturar el estado de retorno de su programa, si se da salida a algo más que números

51

Como una adición a this previous answer, tuberías pueden usarse dentro de una instrucción, se escapó por un acento circunflejo:

for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i 
+1

Dos puntos importantes: Use tokens para capturar y tratar de escapar de la tubería. –

+0

Versión equivalente que funciona en la CLI y se puede copiar y pegar para facilitar el retoque: 'for/f" tokens = * "% i in ('tasklist^| findstr explorer') do @echo% i' Pero, en general, 'usebackq' se debe usar para manejar comandos complejos. –

1

Además de la respuesta, no se puede usar directamente los operadores de redirección de salida en el establecer parte del circuito for (por ejemplo, si desea ocultar la salida de stderror de un usuario y proporcionar un mensaje de error más agradable). En su lugar, usted tiene que escapar de ellos con un carácter de intercalación (^):

for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O) 

Referencia: Redirect output of command in for loop of batch script

0
@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

REM Prefer backtick usage for command output reading: 
REM ENABLEDELAYEDEXPANSION is required for actualized 
REM outer variables within for's scope; 
REM within for's scope, access to modified 
REM outer variable is done via !...! syntax. 

SET CHP=C:\Windows\System32\chcp.com 

FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO (
    IF "%%i" == "Aktive" IF "%%j" == "Codepage:" (
     SET SELCP=%%k 
     SET SELCP=!SELCP:~0,-1! 
    ) 
) 
echo actual codepage [%SELCP%] 

ENDLOCAL 
2

El ejecutor: for /f %%i in ('application arg0 arg1') do set VAR=%%i que estaba haciendo de error: %% i era inesperada en este momento. Como solución, tuve que ejecutar más arriba como for /f %i in ('application arg0 arg1') do set VAR=%i

+1

En un archivo de proceso por lotes necesita '%%' y fuera de un archivo por lotes en una línea de comando necesita '%' –

Cuestiones relacionadas