Legen Sie den Wert einer Variablen mit dem Ergebnis eines Befehls in einer Windows-Batchdatei fest

98

Wenn ich in einer Bash- Umgebung arbeite , um den Wert einer Variablen als Ergebnis eines Befehls festzulegen, gehe ich normalerweise wie folgt vor:

var=$(command -args)

wobei varder Variablensatz durch den Befehl command -args. Ich kann dann auf diese Variable als zugreifen$var .

Eine konventionellere Methode, die mit fast jeder Unix-Shell kompatibel ist, ist:

set var=`command -args`

Wie kann ich jedoch den Wert einer Variablen mit dem Ergebnis eines Befehls in einer Windows-Batchdatei festlegen ? Ich habe es versucht:

set var=command -args

Aber ich finde , dass varzu festgelegt ist , command -argsanstatt die Ausgabe des Befehls.

Francis
quelle

Antworten:

62

Um das zu tun, was Jesse beschreibt , müssen Sie aus einer Windows-Batchdatei Folgendes schreiben:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Ich empfehle jedoch stattdessen, Cygwin auf Ihrem Windows-System zu verwenden, wenn Sie an Skripte vom Typ Unix gewöhnt sind.

nik
quelle
19
verwenden , for /f "delims=" %a in ('ver') do @set foobar=%aauf die Eingabeaufforderung. Verwendung for /f "delims=" %%a in ('ver') do @set foobar=%%ain Skriptdateien
Georg
Eine leichte Alternative ist Gnu On Windows ( github.com/bmatzelle/gow/wiki ). Öffnen Sie einfach eine Eingabeaufforderung und führen Sie sie aus bash. Dann können Sie Bash-Befehle schreiben. Sie können auch Bash-Skripte ausführen.
Nathan
4
Beachten Sie, dass Sie, wenn Ihr Befehl eine Pipe enthält, diese mit einem Caret maskieren müssen, zum Beispiel: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ setze foobar = %% a
yoyo
35

Man muss etwas vorsichtig sein, da der Windows-Batch-Befehl:

for /f "delims=" %%a in ('command') do @set theValue=%%a

hat nicht die gleiche Semantik wie die Unix-Shell-Anweisung:

theValue=`command`

Stellen Sie sich den Fall vor, in dem der Befehl fehlschlägt und einen Fehler verursacht.

In der Unix-Shell-Version erfolgt die Zuweisung zu "theValue" weiterhin, wobei jeder vorherige Wert durch einen leeren Wert ersetzt wird.

In der Windows-Batch-Version wird der Fehler durch den Befehl "for" behandelt, und die Klausel "do" wird nie erreicht. Daher wird der vorherige Wert von "theValue" beibehalten.

Um mehr Unix-ähnliche Semantik im Windows-Batch-Skript zu erhalten, müssen Sie sicherstellen, dass die Zuweisung erfolgt:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Wenn der Wert der Variablen beim Konvertieren eines Unix-Skripts in einen Windows-Stapel nicht gelöscht wird, kann dies zu geringfügigen Fehlern führen.

Jonathan Headland
quelle
2
Vielen Dank, dass Sie den subtilen Unterschied zwischen Windows und * nix erklärt haben.
Jeroen Wiert Pluimers
3
Denken Sie auch daran, Sonderzeichen in zu entkommen command. zB : for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart
@ Bill_Stewart Sie haben gerade meinen Tag gerettet, für einen Moment dachte ich, es sei viel schwieriger, die Ausgabe von
Pipe-
19

So mache ich das, wenn ich die Ergebnisse einer Datenbankabfrage in meiner Batch-Datei benötige:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

Der Schlüssel befindet sich in Zeile 2: "set / p" setzt den Wert von "result" über den Umleitungsoperator "<" auf den Wert der ersten Zeile (nur) in "__query.tmp".

Lotsoffreetime
quelle
14

Ich habe es nur gesehen, wenn Sie dies tun:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver ist der Versionsbefehl für Windows und erzeugt auf meinem System:

Microsoft Windows [Version 6.0.6001]

Quelle

Jesse Dearing
quelle
0
Set "dateTime="
For /F %%A In ('powershell get-date -format "{yyyyMMdd_HHmm}"') Do Set "dateTime=%%A"
echo %dateTime%
pause

Geben Sie hier die Bildbeschreibung ein Offizielle Microsoft-Dokumente für den forBefehl

alchi baucha
quelle