So legen Sie die Ausgabe von Befehlen als Variable in einer Batchdatei fest

242

Ist es möglich, die Ausgabe einer Batchdatei einer Anweisung auf eine Variable zu setzen, zum Beispiel:

findstr testing > %VARIABLE%

echo %VARIABLE%
Dennis
quelle

Antworten:

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

Ich verwende immer USEBACKQ, damit Sie, wenn Sie eine Zeichenfolge oder einen langen Dateinamen einfügen müssen, Ihre doppelten Anführungszeichen verwenden können, ohne den Befehl zu vermasseln.

Wenn Ihre Ausgabe mehrere Zeilen enthält, können Sie dies tun

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
quelle
3
Arbeitete für mich im Win7-System, danke! (und ja, es sind 7 Jahre Nützlichkeit) PS Vergessen Sie nicht,% in %% in Befehlen zu erweitern!
Dmitry Ilukhin
Dies funktioniert hervorragend ... es sei denn, die Ausgabe enthält Ausrufezeichen (!), Da diese bei Verwendung als Steuerzeichen interpretiert werdenENABLEDELAYEDEXPANSION
JonathanDavidArndt
Es funktioniert gut, außer wenn Sie es verwenden müssen. |In diesem Fall funktioniert es nicht.
Matt Vukomanovic
5
@ MattVukomanovic es funktioniert für mich ^|anstelle von |, wie hier
AST
Ist es überhaupt möglich, den Exit-Code zu erfassen command? Ich bin sicher, dass es einen Code ungleich Null zurückgibt, aber %ERRORLEVEL%immer 0 enthält, egal wo ich versuche, ihn zu verwenden (sogar innerhalb des doBlocks). Ich denke, ein Teil dieses forKonstrukts überschreibt es. Übrigens ist es unglaublich, wie verrückt aussehender Code für etwas so Elementares benötigt wird.
David Ferenczy Rogožan
68

Ich habe diesen Thread auf dem dortigen Interweb-Ding gefunden. Läuft darauf hinaus:

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

Sie können die Ausgabe eines Befehls auch in eine temporäre Datei umleiten und dann den Inhalt dieser temporären Datei wie folgt in Ihre Variable einfügen. Es funktioniert jedoch nicht mit mehrzeiliger Eingabe.

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

Gutschrift für den Thread auf Toms Hardware.

Dolphy
quelle
3
Der einzige Nachteil des Bottom-Ansatzes (der auf alle anderen Arten vorzuziehen ist) ist, dass er nicht mit mehrzeiliger Ausgabe funktioniert.
dgo
Für VER würde ich einen anderen Weg gehen: für / f "tokens = 2 delims = [,]" %% a in ('ver') setze Version %% a echo% version%
Hardoman
1
Sie sind das zweite Ergebnis für Likesuchashereby - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky
Ihr zweites Beispiel hat mir beim Schreiben einer Batch-Datei sehr geholfen, um die Version von chromedriver.exe im Vergleich zu einer Textdatei mit einer Versionsnummer zu überprüfen. Ich bin ein alter DOS-Dinosaurier und kannte die Schalter zum Befehl set nicht. Das andere Zeug war übertrieben für mich.
Bill Hileman
47

in einer einzigen Zeile:

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

Die Befehlsausgabe wird in% g und dann in VAR eingestellt.

Weitere Informationen: https://ss64.com/nt/for_cmd.html

Yuri
quelle
19
Mein Stapel wurde nicht mit "% g" ausgeführt. Es lief mit "%% g".
Santiago Villafuerte
5
+ Santiago Villafuerte: Ja, wenn Sie eine Batch-Datei ausführen, diese aber selbst über die Befehlszeile ausführen möchten (z. B. um sie zu testen, bevor Sie sie in die Batch-Datei einfügen), verwenden Sie ein einzelnes%.
Brent Rittenhouse
19

Eine Datei lesen ...

set /P Variable=<File.txt

Eine Datei schreiben

@echo %DataToWrite%>File.txt

Hinweis; Leerzeichen vor dem Zeichen <> führen dazu, dass auch am Ende der Variablen ein Leerzeichen hinzugefügt wird

Um eine Datei wie ein Logger-Programm hinzuzufügen, erstellen Sie zunächst eine Datei mit einer einzigen Eingabetaste namens e.txt

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

Ihr Protokoll wird so aussehen

Entry1
Entry2 

und so weiter

Sowieso ein paar nützliche Dinge


quelle
Vielen Dank für Ihre Antwort. Übrigens liest "set / P Variable = <File.txt" nur die erste Zeile der Datei
Deepscorn
18

Diese Antworten waren alle so nah an der Antwort, die ich brauchte. Dies ist ein Versuch, sie zu erweitern.

In einer Batch-Datei

Wenn Sie aus einer .batDatei heraus arbeiten und eine einzelne Zeile möchten, mit der Sie einen komplizierten Befehl wie jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonin eine Variable mit dem Namen exportieren können AWS_ACCESS_KEY, möchten Sie Folgendes:

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

In der Befehlszeile

Wenn Sie an der C:\Eingabeaufforderung eine einzelne Zeile wünschen, mit der Sie einen komplizierten Befehl wie jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonfür eine Variable mit dem Namen ausführen können AWS_ACCESS_KEY, möchten Sie Folgendes:

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

Erläuterung

Der einzige Unterschied zwischen den beiden obigen Antworten besteht darin, dass Sie in der Befehlszeile ein einzelnes% in Ihrer Variablen verwenden. In einer Batch-Datei müssen Sie die Prozentzeichen (%%) verdoppeln.

Da der Befehl Doppelpunkte, Anführungszeichen und Klammern enthält, müssen Sie die USEBACKQZeile in die Optionen aufnehmen, damit Sie mit Backquotes den auszuführenden Befehl und dann alle Arten von lustigen Zeichen darin angeben können.

Ryan Shillington
quelle
12

Wenn Sie nicht in eine temporäre Datei ausgeben und dann in eine Variable einlesen möchten, speichert dieser Code das Ergebnis des Befehls direkt in einer Variablen:

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

Wenn Sie die Suchzeichenfolge in doppelte Anführungszeichen setzen möchten:

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

Wenn Sie diesen Code in einer Batchdatei speichern möchten, fügen Sie ein zusätzliches% -Symbol hinzu:

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

Ein nützliches Beispiel, um die Anzahl der Dateien in einem Verzeichnis zu zählen und in einer Variablen zu speichern: (veranschaulicht Piping)

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

Beachten Sie die Verwendung von einfachen Anführungszeichen statt doppelten Anführungszeichen "oder Gravis` in der Befehl Klammern. Dies ist sauberere Alternative zu delims, tokensoder usebackqin forSchleife.

Getestet auf Win 10 CMD.

Zimba
quelle
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
Dado
quelle
Ich kann nicht sehen, wie dies die Frage löst. appcmdist kein Standardprogramm und ich kann nicht sehen, wo Sie einer Variablen die Programmausgabe zuweisen. Endlich brauchen Sie noch ein paar Erklärungen
jeb
-3

Ich habe es so getestet und es hat funktioniert:

SET /P Var= | Cmd

Durch Weiterleiten des Befehls an eine Variable fügt die Eingabeaufforderung das Ergebnis des Befehls " Cmd" in die Variable " Var" ein.

Aktualisieren:

Es funktioniert nicht, mein schlechtes, das Skript, das ich gemacht habe, war das folgende:

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

Es zeigte tatsächlich "sagen wir" test.txt", aber es zeigte tatsächlich das Ergebnis des" dir /b *.txt"Befehls, nicht das echo %var%. Ich war verwirrt, da beide Ausgänge gleich waren.

QcAlexN
quelle
3
Wenn Sie beabsichtigt hatten, pipe the command into a variable promptsollten Sie es geschrieben haben dir /b *.txt | SET /P Var=, um Ihre Rohrrichtung korrekt zu machen. PS: So funktioniert es auch nicht!
Jesse Chisholm
-18

Ich hoffe das hilft

set a=%username%
echo %a%    
set a="hello"
echo %a%
Ben2014
quelle
5
Nein, dies beantwortet die Frage nicht. Die Frage ist im Begriff, die Ausgabe eines Befehls in eine Variable zu bekommen
jeb
Der einfache Weg ist, in eine Datei zu schreiben und sie aus dieser Datei zu lesen. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014