È possibile impostare l'output di un'istruzione di un file batch su una variabile, ad esempio:
findstr testing > %VARIABLE%
echo %VARIABLE%
È possibile impostare l'output di un'istruzione di un file batch su una variabile, ad esempio:
findstr testing > %VARIABLE%
echo %VARIABLE%
Risposte:
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
ENABLEDELAYEDEXPANSION
|
nel qual caso non funziona.
command
ogni 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 do
blocco). Quindi immagino che una parte di quel for
costrutto lo sta sovrascrivendo. A proposito, è incredibile quanto sia necessario un codice dall'aspetto folle per qualcosa di così elementare.
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.
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
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
Queste risposte erano tutte così vicine alla risposta di cui avevo bisogno. Questo è un tentativo di espandersi su di loro.
Se stai eseguendo da un .bat
file e vuoi una singola riga che ti permetta di esportare un comando complicato come jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
in una variabile chiamata AWS_ACCESS_KEY
allora vuoi questo:
FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")
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.json
una variabile denominata, AWS_ACCESS_KEY
quindi vuoi questo:
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
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 USEBACKQ
riga 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.
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
, tokens
o usebackq
in for
loop.
Testato su 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
non è 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
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 *.txt
comando " ", non il echo %var%
. Mi sono confuso poiché entrambe le uscite erano uguali.
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!
Spero che questo aiuto
set a=%username%
echo %a%
set a="hello"
echo %a%