Come impostare l'output dei comandi come variabile in un file batch


243

È possibile impostare l'output di un'istruzione di un file batch su una variabile, ad esempio:

findstr testing > %VARIABLE%

echo %VARIABLE%



possibile duplicato di file batch
Nathan,

un altro duplicato solo per divertimento: il batch di Windows assegna l'output di un programma a una variabile
icc97

Risposte:


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

Uso sempre USEBACKQ in modo che se si dispone di una stringa da inserire o di un nome file lungo, è possibile utilizzare le virgolette doppie senza rovinare il comando.

Ora se l'output conterrà più righe, puoi farlo

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

3
Ha funzionato per me nel sistema Win7, grazie! (e sì, sono 7 anni di utilità) PS Non dimenticare di espandere% in %% nei comandi!
Dmitry Ilukhin,

Funziona benissimo ... a meno che l'output non contenga punti esclamativi (!), Poiché questi verranno interpretati come caratteri di controllo quando si utilizzaENABLEDELAYEDEXPANSION
JonathanDavidArndt

Funziona bene, tranne se è necessario utilizzare |nel qual caso non funziona.
Matt Vukomanovic,

6
@MattVukomanovic funziona per me usando ^|al posto di |, come descritto qui
AST

È possibile acquisire il codice di uscita in commandogni caso, per favore? Sono sicuro che restituisce un codice diverso da zero ma %ERRORLEVEL%contiene sempre 0, indipendentemente da dove provo ad usarlo (anche all'interno del doblocco). Quindi immagino che una parte di quel forcostrutto lo sta sovrascrivendo. A proposito, è incredibile quanto sia necessario un codice dall'aspetto folle per qualcosa di così elementare.
David Ferenczy Rogožan,

69

Ho trovato questa discussione su quella cosa di Interweb. Si riduce a:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

Puoi anche reindirizzare l'output di un comando su un file temporaneo, quindi inserire il contenuto di quel file temporaneo nella tua variabile, likeuchashereby. Tuttavia, non funziona con l'input multilinea.

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

Ringraziamo il thread sull'hardware di Tom.


3
L'unico inconveniente dell'approccio bottom (che è preferibile in tutti gli altri modi) è che non funziona con l'output multilinea.
DGO

Per VER andrei in un altro modo: per / f "token = 2 delims = [,]" %% a in ('ver') imposta la versione %% a echo% versione%
Hardoman

1
tu sei il secondo risultato per Likeuchashereby - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky

Il tuo secondo esempio mi ha aiutato moltissimo a scrivere un file batch per verificare la versione di chromedriver.exe rispetto a un file di testo contenente un numero di versione. Sono un vecchio dinosauro DOS, e non ero a conoscenza delle opzioni del comando set. L'altra roba è stata eccessiva per me.
Bill Hileman,

47

in una sola riga:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

l'output del comando verrà impostato in% g quindi in VAR.

Ulteriori informazioni: https://ss64.com/nt/for_cmd.html


19
Il mio batch non è stato eseguito con "% g". Funzionava con "%% g".
Santiago Villafuerte,

5
+ Santiago Villafuerte: sì, se si esegue da un file batch, ma se si desidera eseguirlo dalla riga di comando (ad esempio: per testarlo prima di inserirlo nel file batch), si utilizza una sola%.
Brent Rittenhouse,

19

Per leggere un file ...

set /P Variable=<File.txt

Per scrivere un file

@echo %DataToWrite%>File.txt

Nota; avere spazi prima del carattere <> provoca anche l'aggiunta di uno spazio alla fine della variabile

Per aggiungere un file, come un programma logger, per prima cosa crea un file con una sola chiave di invio chiamata e.txt

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

il tuo registro sarà simile a questo

Entry1
Entry2 

e così via

Comunque un paio di cose utili


La ringrazio per la risposta. BTW "set / P Variable = <File.txt" legge solo la prima riga del file
Deepscorn

19

Queste risposte erano tutte così vicine alla risposta di cui avevo bisogno. Questo è un tentativo di espandersi su di loro.

In un file batch

Se stai eseguendo da un .batfile e vuoi una singola riga che ti permetta di esportare un comando complicato come jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonin una variabile chiamata AWS_ACCESS_KEYallora vuoi questo:

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

Sulla riga di comando

Se sei al C:\prompt, vuoi una singola riga che ti consenta di eseguire un comando complicato come jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonuna variabile denominata, AWS_ACCESS_KEYquindi vuoi questo:

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

Spiegazione

L'unica differenza tra le due risposte sopra è che nella riga di comando usi una singola% nella tua variabile. In un file batch, devi raddoppiare i segni di percentuale (%%).

Poiché il comando include due punti, virgolette e parentesi, è necessario includere la USEBACKQriga nelle opzioni in modo da poter utilizzare i backquotes per specificare il comando da eseguire e quindi tutti i tipi di caratteri divertenti al suo interno.


13

Se non si desidera eseguire l'output in un file temporaneo e quindi leggere in una variabile, questo codice memorizza il risultato del comando direttamente in una variabile:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

Se vuoi racchiudere la stringa di ricerca tra virgolette doppie:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

Se si desidera archiviare questo codice in un file batch, aggiungere un ulteriore simbolo%:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

Un esempio utile per contare il numero di file in una directory e archiviare in una variabile: (illustra il piping)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

Si noti l'uso di virgolette singole invece di doppie virgolette "o accento grave" nelle parentesi di comando. Questa è un'alternativa più pulita a delims, tokenso usebackqin forloop.

Testato su Win 10 CMD.


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

Non riesco a vedere come questo risolva la domanda. appcmdnon è un programma standard e non riesco a vedere dove si assegna l'output del programma a una variabile. Alla fine hai bisogno di ulteriori spiegazioni
jeb

-3

L'ho provato in questo modo e ha funzionato:

SET /P Var= | Cmd

Effettuando il piping del comando in una variabile, il prompt inserirà il risultato del comando " Cmd" nella variabile " Var".

Aggiornare:

Non funziona, mio ​​male, la sceneggiatura che ho fatto è stata questa:

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

In realtà stava mostrando diciamo " test.txt", ma in realtà stava mostrando il risultato del dir /b *.txtcomando " ", non il echo %var%. Mi sono confuso poiché entrambe le uscite erano uguali.


3
Se avessi voluto farlo pipe the command into a variable prompt, avresti dovuto scriverlo dir /b *.txt | SET /P Var=per ottenere la direzione del tubo corretta. PS: Neanche in questo modo funziona!
Jesse Chisholm,

-18

Spero che questo aiuto

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
No, questo non risponde alla domanda. La domanda sta per ottenere l'output di un comando in una variabile
jeb

Il modo più semplice è scrivere su un file e leggerlo da quel file. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.