Ist es möglich, die Ausgabe einer Batchdatei einer Anweisung auf eine Variable zu setzen, zum Beispiel:
findstr testing > %VARIABLE%
echo %VARIABLE%
Ist es möglich, die Ausgabe einer Batchdatei einer Anweisung auf eine Variable zu setzen, zum Beispiel:
findstr testing > %VARIABLE%
echo %VARIABLE%
Antworten:
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
ENABLEDELAYEDEXPANSION
|
In diesem Fall funktioniert es nicht.
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 do
Blocks). Ich denke, ein Teil dieses for
Konstrukts überschreibt es. Übrigens ist es unglaublich, wie verrückt aussehender Code für etwas so Elementares benötigt wird.
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.
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
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
Diese Antworten waren alle so nah an der Antwort, die ich brauchte. Dies ist ein Versuch, sie zu erweitern.
Wenn Sie aus einer .bat
Datei heraus arbeiten und eine einzelne Zeile möchten, mit der Sie einen komplizierten Befehl wie jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json
in 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")
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.json
fü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")
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 USEBACKQ
Zeile in die Optionen aufnehmen, damit Sie mit Backquotes den auszuführenden Befehl und dann alle Arten von lustigen Zeichen darin angeben können.
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
, tokens
oder usebackq
in for
Schleife.
Getestet auf 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
ist kein Standardprogramm und ich kann nicht sehen, wo Sie einer Variablen die Programmausgabe zuweisen. Endlich brauchen Sie noch ein paar Erklärungen
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.
pipe the command into a variable prompt
sollten Sie es geschrieben haben dir /b *.txt | SET /P Var=
, um Ihre Rohrrichtung korrekt zu machen. PS: So funktioniert es auch nicht!
Ich hoffe das hilft
set a=%username%
echo %a%
set a="hello"
echo %a%