Ich möchte das Ergebnis eines Befehls als Variable in einem Windows-Batch-Skript abrufen (siehe das Abrufen des Ergebnisses eines Befehls in bash für das Bash-Skriptäquivalent). Eine Lösung, die in einer .bat-Datei funktioniert, wird bevorzugt, aber auch andere gängige Windows-Skriptlösungen sind willkommen.
windows
scripting
batch-file
John Meagher
quelle
quelle
Antworten:
Wenn Sie die gesamte Befehlsausgabe erfassen müssen, können Sie einen Stapel wie den folgenden verwenden:
Alle Ausgangsleitungen werden in VAR gespeichert, getrennt durch "!".
@ John: Gibt es eine praktische Verwendung dafür? Ich denke, Sie sollten sich PowerShell oder eine andere Programmiersprache ansehen, mit der Skriptaufgaben problemlos ausgeführt werden können (Python, Perl, PHP, Ruby).
quelle
cmd
damit ich es dort ausführen kann. ... Ja, das ist so schrecklich wie Geräusche. Visual Studio bringt mich manchmal zum Weinen. @ Ajedi32 Ich denke, Sie wollten damit sagen, dass Batch- Skripte ein schreckliches Relikt der Vergangenheit sind. ;)Der demütige für Befehl hat einige interessante Fähigkeiten im Laufe der Jahre:
Beachten Sie, dass
"delims="
die Standardtrennzeichen für Leerzeichen und Tabulatoren überschrieben werden, sodass die Ausgabe des Datumsbefehls auf einmal verschlungen wird.Um eine mehrzeilige Ausgabe zu erfassen, kann es sich im Wesentlichen immer noch um eine Einzeilerausgabe handeln (wobei die Variable lf als Begrenzer in der resultierenden Variablen verwendet wird):
Verwenden Sie zum Erfassen eines Pipe-Ausdrucks
^|
:quelle
FOR /F "delims=" %%i IN ('date /t') DO set today=%%i
for
Befehl direkt in die Befehlszeile eingeben , verwenden Sie einen einzelnen%
. Wenn Sie es in einer Batch-Datei verwenden, verwenden Sie%%
.%
, zum Beispiel:for /f "delims=" %%i in ('date +%F_%H-%M-%S') do set now=%%i
date
Befehl kommt von Cygwin verwendet. Ich bin damit einverstanden, dass ich das hätte erwähnen sollen.Um das aktuelle Verzeichnis abzurufen, können Sie Folgendes verwenden:
Es wird zwar eine temporäre Datei verwendet, es ist also nicht die schönste, aber es funktioniert auf jeden Fall! 'CD' legt das aktuelle Verzeichnis in 'tmpFile' ab, 'SET' lädt den Inhalt von tmpFile.
Hier ist eine Lösung für mehrere Zeilen mit "Arrays":
Möglicherweise möchten Sie jedoch zu einer anderen leistungsstärkeren Shell wechseln oder eine Anwendung für dieses Material erstellen. Es erweitert die Möglichkeiten der Batch-Dateien erheblich.
quelle
Sie müssen den
SET
Befehl mit Parameter verwenden/P
und Ihre Ausgabe darauf richten. Siehe beispielsweise http://www.ss64.com/nt/set.html . Funktioniert für CMD, nicht sicher über .BAT-DateienVon einem Kommentar zu diesem Beitrag:
quelle
Beispiel zum Festlegen der neuesten Datei in der Umgebungsvariablen "V"
In einer Batch-Datei müssen Sie das doppelte Präfix in der Schleifenvariablen verwenden:
quelle
Verwenden Sie einfach das Ergebnis aus dem
FOR
Befehl. Zum Beispiel (innerhalb einer Batch-Datei):Sie können das
%%I
als den gewünschten Wert verwenden. Einfach so :%%I
.Und im Voraus hat der
%%I
keine Leerzeichen oder CR-Zeichen und kann für Vergleiche verwendet werden !!quelle
Wenn Sie nach der Lösung suchen, die unter Verwenden des Ergebnisses eines Befehls als Argument in bash bereitgestellt wird ?
dann ist hier der Code:
[Credits] : Dank all der anderen Antworten und einigen Informationen auf der Windows XP-Befehlsseite .
quelle
quelle
Ich möchte den obigen Lösungen eine Bemerkung hinzufügen:
Alle diese Syntaxen funktionieren einwandfrei, wenn Ihr Befehl im Pfad gefunden wurde oder wenn der Befehl ein Cmd-Pfad ohne Leerzeichen oder Sonderzeichen ist.
Wenn Sie jedoch versuchen, einen ausführbaren Befehl zu verwenden, der sich in einem Ordner befindet, dessen Pfad Sonderzeichen enthält, müssen Sie Ihren Befehlspfad in doppelte Anführungszeichen (") setzen, und die FOR / F-Syntax funktioniert dann nicht.
Beispiele:
oder
oder
In diesem Fall besteht die einzige Lösung, die ich gefunden habe, um einen Befehl zu verwenden und sein Ergebnis in einer Variablen zu speichern, darin, das Standardverzeichnis (vorübergehend) auf das des Befehls selbst zu setzen:
Das Ergebnis ist dann richtig:
Im obigen Beispiel gehe ich natürlich davon aus, dass sich mein Batch-Skript im selben Ordner befindet wie der meines ausführbaren Befehls, damit ich die Syntax "% ~ d0% ~ p0" verwenden kann. Wenn dies nicht der Fall ist, müssen Sie einen Weg finden, Ihren Befehlspfad zu finden und das Standardverzeichnis in seinen Pfad zu ändern.
NB: Für diejenigen, die sich fragen, lautet der hier verwendete Beispielbefehl (zum Auswählen eines Ordners) FOLDERBROWSE.EXE. Ich habe es auf der Website f2ko.de ( http://f2ko.de/en/cmd.php ) gefunden.
Wenn jemand eine bessere Lösung für diese Art von Befehlen hat, auf die über einen komplexen Pfad zugegriffen werden kann, würde ich mich sehr freuen, davon zu hören.
Gilles
quelle
CALL
. FOR / F funktioniert nicht, wenn der Pfad Leerzeichen enthältCALL "%SOURCEDIR%\FOLDERBROWSE" ... "quoted parameters"
funktioniert mein Code < > perfekt.Sie können alle Ausgaben in einer Variablen erfassen, die Zeilen werden jedoch durch ein Zeichen Ihrer Wahl (# im folgenden Beispiel) anstelle eines tatsächlichen CR-LF getrennt.
Zweite Version, wenn Sie den Inhalt zeilenweise ausdrucken müssen. Dies nutzt die Tatsache aus, dass es keine doppelten Ausgabezeilen von "dir / b" gibt, so dass es im allgemeinen Fall möglicherweise nicht funktioniert.
quelle
das Ergebnis ist 'TXT: hola'
quelle
Sie sollten den
for
Befehl verwenden, hier ein Beispiel:und Sie können verwenden,
call :output "Command goes here"
dann wird die Ausgabe in der%output%
Variablen sein.Hinweis: Wenn Sie eine mehrzeilige Befehlsausgabe haben, gibt dieses Tool
set
die Ausgabe in die letzte Zeile Ihres mehrzeiligen Befehls aus.quelle
Weitere Informationen hierzu finden Sie unter http://technet.microsoft.com/en-us/library/bb490982.aspx. Dort wird erläutert, was Sie mit der Befehlsausgabe tun können.
quelle
git pull>0 set /P RESULTVAR=<0
ich mir Folgendes ausgedacht : Bearbeiten: Ich glaube, ich weiß nicht, wie man Zeilenumbrüche hier verwendet ... jeder Befehl steht in einer eigenen Zeile.