Batch-Äquivalent zu Bash-Backticks

Antworten:

53

Sie können dies tun, indem Sie die Ausgabe zuerst in eine Datei umleiten. Beispielsweise:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
zvrba
quelle
16
Sie müssen einen Ort finden, an dem Sie Schreibzugriff haben, um die temporäre Datei zu speichern. du musst nach dir selbst aufräumen; In diesem Beispiel können Sie nur die erste Eingabezeile lesen. Für alle praktischen Zwecke ist die for /fVariante viel besser.
Joey
@grawity - zusammen mit%random%
Bacar
1
@joey Es liest zwar jede Zeile, aber wie man in einem einzigen Befehl zu einem Befehlszeilenargument verkettet .
user877329
Wie geht es mit Zeilenumbrüchen um?
Andrewrk
103

Sie können eine ähnliche Funktionalität mithilfe von cmd.exe-Skripten mit dem folgenden for /fBefehl erhalten:

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

Ja, es ist irgendwie nicht offensichtlich (um es gelinde auszudrücken), aber es ist das, was da ist.

Siehe for /?für die blutigen Details.

Nebenbemerkung: Ich dachte, dass die Verwendung von " echo" innerhalb der Backticks in einem " for /f" Befehl mit " cmd.exe /c echo Test" erfolgen müsste, da dies echoein interner Befehl ist cmd.exe, aber es funktioniert auf natürlichere Weise. Windows-Batch-Skripte überraschen mich immer irgendwie (aber normalerweise nicht gut).

Michael Burr
quelle
2
Normalerweise müssen Sie dies tun, wenn Sie Shell-Builtins aus externen Programmen ausführen, die eine Shell nicht automatisch erzeugen. system()Dh C's war in Ordnung, iirc, da es auf jeden Fall eine Shell startet, aber .NET's Process.Startmuss die Shell explizit aufrufen. So etwas, iirc. Auf jeden Fall halte ich dies für die bessere Antwort als die akzeptierte :-)
Joey
2
Die Optionen, fordas Problem nicht zu verletzen, sondern zu verwirren. Was ist damit:for /f %%a in ('"echo Test"') do my_command %%a
Evan Haas
9
Verwenden Sie ein einzelnes% anstelle von %%, wenn Sie dasselbe in der Befehlszeile ausführen, anstatt in einem Batch-Skript.
jsears
2
Scheint nicht gut mit Rohrleitungen zu funktionieren, zum Beispiel mit dem Operator ">". Aber sonst ist das großartig. Es sei denn, dies war nur ein% vs %% Problem, das ich hatte.
Jonathan
3
@Evan: tokens=*ist wichtig. Andernfalls wird nur das erste Wort ausgegeben, wenn das Ergebnis des Befehls Leerzeichen enthält. Führen Sie dies an der Eingabeaufforderung aus : for /f %a in ('"echo foo bar"') do echo "%a". Es wird gedruckt "foo".
Dan Dascalescu
29

Lesen Sie die Dokumentation zum Befehl "for": for /?

Leider bin ich nicht bei Windows angemeldet, um es selbst zu überprüfen, aber ich denke, so etwas kann sich Ihren Wünschen annähern:

for /F %i in ('echo Test') do my_command %i
Weeble
quelle
6
Falls jemand anderes darauf stößt und der Befehl aus einer Batchdatei (* .bat) ausgeführt wird, müssen beide% i-Variablen ein doppeltes Prozentzeichen haben: %% i.
mgouin
3

Sie können Bash jederzeit in Windows ausführen . Ich mache es die ganze Zeit mit MSYS (viel effizienter als Cygwin ).

davr
quelle
Leider wird MSYS derzeit kaum gewartet. Um eine aktuelle Bash zu erhalten, müssen Sie es separat installieren
Ed Randall
1
BusyBox ist noch kleiner (~ 432KB). Kein voller Bash, nur Ash. Holen Sie sich den inoffiziellen Windows-Port hier: frippery.org/busybox
Martin
3

Vielleicht vermassle ich die Syntax der Standardmethode for /f, aber wenn ich einen sehr komplexen Befehl mit && und | setze Innerhalb der Backticks im Limit von for /fverursacht es Probleme. Eine geringfügige Änderung gegenüber dem üblichen ist möglich, um einen beliebigen Komplexitätsbefehl zu handhaben:

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

Indem Sie zuerst Ihren vollständigen und komplexen Befehl in eine Variable einfügen und dann einen Verweis auf die Variable in das Limit einfügen, anstatt den komplexen Befehl direkt in das Limit der for-Schleife zu setzen, können Sie Syntaxinterpretationsprobleme vermeiden. Wenn ich derzeit den genauen Befehl, den ich für die VVVariable im obigen Beispiel festgelegt habe, in den Verwendungszweck kopiere %VV%, verursacht dies Syntaxfehler.

Mtalexan
quelle
1
Dies hat bei mir nicht funktioniert, aber ich habe festgestellt, dass Sie Pipings direkt innerhalb des for-Befehls ausführen können, wenn Sie mit einem Karat (^) davonkommen: for / f "usebackq tokens = *" %% a in (`command ^ | Befehl`) Befehl %% a
Heptite
@Heptite Card Escapeing hat bei mir nicht funktioniert, aber die umgebende Befehlszeile mit doppelten Anführungszeichen hat funktioniert.
Alexandr Zarubkin
@Heptite In meinem Fall wusste ich nicht, welche Reihe von Befehlen ich zuvor ausführen musste. In einem Fall wurden sie aus einer Datei extrahiert und in einem anderen übergeben. Bei der Escape-Funktion müssen Sie wissen, wie oft Sie dem Befehl entkommen müssen, basierend auf der Anzahl der Interpreter, die durchlaufen werden sollen. In meinen Anwendungsfällen war dies keine konsistente Anzahl von Interpreten.
Mtalexan