Batch-Äquivalent zu Bash-Backticks


97

Wenn ich mit Bash arbeite, kann ich die Ausgabe eines Befehls wie folgt in einen anderen Befehl einfügen:

my_command `echo Test`

wäre das gleiche wie

my_command Test

(Offensichtlich ist dies nur ein unpraktisches Beispiel.)

Ich frage mich nur, ob Sie in Batch dasselbe tun können.


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%

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).


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

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 ).


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.