¿Es posible establecer la salida de una declaración de un archivo por lotes a una variable, por ejemplo:
findstr testing > %VARIABLE%
echo %VARIABLE%
¿Es posible establecer la salida de una declaración de un archivo por lotes a una variable, por ejemplo:
findstr testing > %VARIABLE%
echo %VARIABLE%
Respuestas:
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
ENABLEDELAYEDEXPANSION
|
en cuyo caso no funciona.
command
todos 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 do
bloque). Así que supongo que una parte de ese for
constructo lo está sobrescribiendo. Por cierto, es increíble lo loco que se necesita un código de aspecto para algo tan elemental.
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.
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
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
Estas respuestas estaban tan cerca de la respuesta que necesitaba. Este es un intento de ampliarlos.
Si está ejecutando desde un .bat
archivo y desea una sola línea que le permita exportar un comando complicado como jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
a una variable llamada, AWS_ACCESS_KEY
entonces quiere esto:
FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
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.json
una variable llamada, AWS_ACCESS_KEY
entonces desea esto:
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
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 USEBACKQ
lí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.
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
, tokens
o usebackq
en for
bucle.
Probado en Win 10 CMD.
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
appcmd
no 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
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 *.txt
comando " ", no el echo %var%
. Me confundí ya que ambas salidas eran iguales.
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!
Espero que esto ayude
set a=%username%
echo %a%
set a="hello"
echo %a%