variable manejo comando batch bat batch-file cmd variable-assignment windows-console

batch-file - manejo - set/p batch



Asignar salida de un programa a una variable (8)

@OP, puede usar los bucles para capturar el estado de retorno de su programa, si produce algo diferente a los números

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

Así que en GNU Bash shell 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 .


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

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

Referencia: Redirigir la salida del comando en para bucle de script por lotes


Al ejecutar: for /f %%i in (''application arg0 arg1'') do set VAR=%%i i estaba recibiendo un error: %% i era inesperado en este momento. Como solución, tuve que ejecutar arriba como for /f %i in (''application arg0 arg1'') do set VAR=%i


Como una adición a esta respuesta anterior , las tuberías pueden usarse dentro de una declaración for, escapada por un símbolo de intercalación:

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


Escribí la secuencia de comandos que emite Google.com cada 5 segundos y registra los resultados con la hora actual. Aquí puede encontrar la salida a las variables "commandLineStr" (con índices)

@echo off :LOOPSTART echo %DATE:~0% %TIME:~0,8% >> Pingtest.log SETLOCAL ENABLEDELAYEDEXPANSION SET scriptCount=1 FOR /F "tokens=* USEBACKQ" %%F IN (`ping google.com -n 1`) DO ( SET commandLineStr!scriptCount!=%%F SET /a scriptCount=!scriptCount!+1 ) @ECHO %commandLineStr1% >> PingTest.log @ECHO %commandLineStr2% >> PingTest.log ENDLOCAL timeout 5 > nul GOTO LOOPSTART


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%


Una forma es:

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

Otro es:

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

Tenga en cuenta que el primer % en %%i se usa para escapar del % después de él y es necesario cuando se usa el código anterior en un archivo por lotes en lugar de en la línea de comandos. Imagina, tu 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%


@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