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

243

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

findstr testing > %VARIABLE%

echo %VARIABLE%
Dennis
fuente
2
posible duplicado del equivalente
backticks
En realidad, el original parece ser ¿Cómo obtengo el resultado de un comando en una variable en Windows? .
Cristian Ciupitu 01 de
posible duplicado de archivos por lotes
Nathan

Respuestas:

275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

Siempre uso USEBACKQ, de modo que si tiene una cadena para insertar o un nombre de archivo largo, puede usar sus comillas dobles sin arruinar 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
Mechaflash
fuente
3
Trabajó para mí en el sistema Win7, ¡gracias! (y sí, son 7 años de utilidad) PD ¡No olvides expandir% a %% en los comandos!
Dmitry Ilukhin
Esto funciona muy bien ... a menos que la salida contenga signos de exclamación (!), Ya que estos se interpretarán como caracteres de control cuando se useENABLEDELAYEDEXPANSION
JonathanDavidArndt
Funciona bien, excepto si necesita usar |en cuyo caso no funciona.
Matt Vukomanovic
66
@MattVukomanovic funciona para mí usando ^|en lugar de |, como se describe aquí
AST
¿Es posible capturar el código de salida de commandtodos modos, por favor? Estoy seguro de que está devolviendo un código distinto de cero, pero %ERRORLEVEL%siempre contiene 0, sin importar dónde intente usarlo (incluso dentro del dobloque). Así que supongo que una parte de ese forconstructo lo está sobrescribiendo. Por cierto, es increíble lo loco que se necesita un código de aspecto para algo tan elemental.
David Ferenczy Rogožan
69

Encontré este hilo en esa cosa 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 aquí. Sin embargo, no funciona con entrada multilínea.

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

Crédito al hilo en el hardware de Tom.

delfín
fuente
3
El único inconveniente del enfoque inferior (que es preferible en todas las demás formas) es que no funciona con salida de varias líneas.
dgo
Para VER, iría de otra manera: para / f "tokens = 2 delims = [,]" %% a in ('ver') do set version %% a echo% version%
Hardoman
1
eres el segundo resultado de likesuchashereby - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky
Su segundo ejemplo me ayudó mucho a escribir un archivo por lotes para verificar la versión de chromedriver.exe frente a un archivo de texto que contiene un número de versión. Soy un viejo dinosaurio de DOS y no estaba al tanto de los cambios al comando set. Las otras cosas fueron excesivas para mí.
Bill Hileman
47

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: https://ss64.com/nt/for_cmd.html

Yuri
fuente
19
Mi lote no se ejecutó con "% g". Funcionó con "%% g".
Santiago Villafuerte
55
+ Santiago Villafuerte: sí, si está ejecutando desde un archivo por lotes, pero si desea ejecutarlo desde la línea de comando usted mismo (por ejemplo: para probarlo antes de ponerlo en el archivo por lotes), entonces usa un solo%.
Brent Rittenhouse
19

Para leer un archivo ...

set /P Variable=<File.txt

Para escribir un archivo

@echo %DataToWrite%>File.txt

Nota; tener espacios antes del carácter <> hace que se agregue un espacio al final de la variable, también

Para agregar a un archivo, como un programa de registro, primero haga un archivo con una sola tecla enter llamada e.txt

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

su registro se verá así

Entry1
Entry2 

y así

De todas formas un par de cosas útiles


fuente
Gracias por su respuesta. BTW "set / P Variable = <archivo.txt" sólo lee primera línea del archivo
Deepscorn
19

Estas respuestas estaban tan cerca de la respuesta que necesitaba. Este es un intento de ampliarlos.

En un archivo por lotes

Si está ejecutando desde un .batarchivo y desea una sola línea que le permita exportar un comando complicado como jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsona una variable llamada, AWS_ACCESS_KEYentonces quiere esto:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

En la línea de comando

Si está en el C:\indicador, desea una sola línea que le permita ejecutar un comando complicado, como jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonuna variable llamada, AWS_ACCESS_KEYentonces desea esto:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

Explicación

La única diferencia entre las dos respuestas anteriores es que en la línea de comando, utiliza un solo% en su variable. En un archivo por lotes, debe duplicar los signos de porcentaje (%%).

Dado que el comando incluye dos puntos, comillas y paréntesis, debe incluir la USEBACKQlínea en las opciones para que pueda usar comillas inversas para especificar el comando que se ejecutará y luego todo tipo de caracteres divertidos dentro de él.

Ryan Shillington
fuente
13

Si no desea generar un archivo temporal y luego leerlo en una variable, este código almacena el resultado del comando directo 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 almacenar en una variable: (ilustra las tuberías)

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 soportes de mando. Este es alternativa más limpia a delims, tokenso usebackqen forbucle.

Probado en Win 10 CMD.

Zimba
fuente
1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause
Friso
fuente
No puedo ver cómo esto resuelve la pregunta. appcmdno es un programa estándar y no puedo ver dónde asigna la salida del programa a una variable. Por fin necesitas algunas explicaciones más
jeb
-3

Lo probé así y funcionó:

SET /P Var= | Cmd

Al canalizar el comando en una variable, el indicador insertará el resultado del comando " Cmd" en la variable " Var".

Actualizar:

No funciona, mi mal, el guión que hice fue este:

SET /P Var= | dir /b *.txt
echo %Var%

En realidad estaba mostrando, digamos " test.txt", pero en realidad mostraba el resultado del dir /b *.txtcomando " ", no el echo %var%. Me confundí ya que ambas salidas eran iguales.

QcAlexN
fuente
3
Si hubiera tenido la intención de hacerlo pipe the command into a variable prompt, debería haberlo escrito dir /b *.txt | SET /P Var=para obtener la dirección correcta de la tubería. PD: ¡tampoco funciona de esa manera!
Jesse Chisholm
-18

Espero que esto ayude

set a=%username%
echo %a%    
set a="hello"
echo %a%
Ben2014
fuente
55
No, esto no responde la pregunta. La pregunta está a punto de obtener la salida de un comando en una variable
jeb
La manera fácil es escribir en un archivo y leerlo desde ese archivo. "Test" de findtr test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014