Cómo configurar la salida de comandos como una variable en un archivo por lotes [duplicado]

Resuelto Dennis asked hace 13 años • 0 respuestas

¿Es posible establecer la salida de una declaración de un archivo por lotes en una variable, por ejemplo:

findstr testing > %VARIABLE%

echo %VARIABLE%
Dennis avatar Jun 15 '11 22:06 Dennis
Aceptado
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
Anthony Miller avatar Jun 15 '2011 19:06 Anthony Miller

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

Yuri avatar Jan 23 '2018 15:01 Yuri

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.

dolphy avatar Jun 15 '2011 15:06 dolphy

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 delimso tokensen usebackqbucle 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.

Zimba avatar Sep 05 '2019 09:09 Zimba