Cómo configurar la salida de comandos como una variable en un archivo por lotes [duplicado]
¿Es posible establecer la salida de una declaración de un archivo por lotes en una variable, por ejemplo:
findstr testing > %VARIABLE%
echo %VARIABLE%
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%
Siempre uso USEBACKQ para que si tiene una cadena para insertar o un nombre de archivo largo, pueda usar comillas dobles sin estropear el comando.
Ahora, si su salida contendrá varias líneas, puede hacer esto
SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var!count!=%%F
SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL
En una sola línea:
FOR /F "tokens=*" %%g IN ('your command') do (SET VAR=%%g)
La salida del comando se establecerá en %g y luego en VAR.
Más información aquí: https://ss64.com/nt/for_cmd.html
Encontré este hilo en eso de Interweb. Se reduce a:
@echo off
setlocal enableextensions
for /f "tokens=*" %%a in (
'VER'
) do (
set myvar=%%a
)
echo/%%myvar%%=%myvar%
pause
endlocal
También puede redirigir la salida de un comando a un archivo temporal y luego colocar el contenido de ese archivo temporal en su variable, como por ejemplo. Sin embargo, no funciona con entradas multilínea.
cmd > tmpFile
set /p myvar= < tmpFile
del tmpFile
Crédito al hilo de Tom's Hardware.
Si no desea generar un archivo temporal y luego leerlo en una variable, este código almacena el resultado del comando directamente en una variable:
FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%
Si desea encerrar la cadena de búsqueda entre comillas dobles:
FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i
Si desea almacenar este código en un archivo por lotes, agregue un símbolo % adicional:
FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i
Un ejemplo útil para contar la cantidad de archivos en un directorio y almacenarlos en una variable: (ilustra la tubería)
FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i
Tenga en cuenta el uso de comillas simples en lugar de comillas dobles " o acento grave ` en los corchetes de comando. Esta es una alternativa más limpia a delims
o tokens
en usebackq
bucle for
.
Actualización 27/8/2021:
Otro método es configurar la variable nivel de error, aunque muchos desaconsejan configurar el nivel de error en scripts grandes o cuando se es nuevo en el tipo cmd de la variante del sistema operativo instalado.
Este método funciona cuando el valor (de retorno) que se va a almacenar cabe en un entero de 32 bits.
p.ej. contar la cantidad de archivos en un directorio y almacenarlos en una variable llamada count
:
(dir /b /a-d ^| find /v /c "?") | (set /p myVar=& cmd /c exit /b %myVar%)
set count=%errorlevel%
Detallado: gane las pruebas de límites enteros de CMD:
Límite aritmético de Win CMD: 2147483647 (enteros de 32 bits)
El desbordamiento de la pila continuaría contando en -2147483648 y se restablecería nuevamente después de alcanzar 2147483647
REM See tests below:
cmd /c exit /b 2147483647
echo %errorlevel%
2147483647
cmd /c exit /b 2147483648
echo %errorlevel%
-2147483648
cmd /c exit /b 2147483649
echo %errorlevel%
-2147483647
El método anterior se puede modificar para devolver cadenas codificadas para descodificarlas en el proceso principal (dentro de un límite de 32 bits).
Una tercera ilustración, aunque de uso limitado (porque la variable se establece en el proceso hijo, no en el padre), es:
(dir /b /a-d ^| find /v /c "?") | (set /p myVar=& set myVar)
En este caso, el valor de myVar se establece en la cantidad de archivos en el directorio.
Probado en Win 10 CMD.