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