Antworten:
So auf allen Microsoft-Betriebssystemen seit 2000 und heute noch gut:
dir & echo foo
Wenn der zweite Befehl nur ausgeführt werden soll, wenn der erste erfolgreich beendet wurde:
dir && echo foo
Die einzelne kaufmännische Und (&) -Syntax zum Ausführen mehrerer Befehle in einer Zeile geht auf Windows XP, Windows 2000 und einige frühere NT-Versionen zurück. (Zumindest 4.0, laut einem Kommentator hier.)
Es gibt noch einige andere Punkte, die Sie auf dieser Seite finden.
Es folgen historische Daten für diejenigen, die sie als lehrreich empfinden.
Zuvor war die && -Syntax nur eine Funktion des Shell-Ersatzes 4DOS, bevor diese Funktion dem Microsoft-Befehlsinterpreter hinzugefügt wurde.
In Windows 95, 98 und ME verwenden Sie stattdessen das Pipe-Zeichen:
dir | echo foo
In MS-DOS 5.0 und höher war das (undokumentierte) Befehlstrennzeichen in einigen früheren Windows- und NT-Versionen des Befehlsinterpreters das Zeichen 20 (Strg + T), das ich hier mit ^ T darstellen werde.
dir ^T echo foo
cmd
Eingabeaufforderung, also ist es wohl keine schlechte Angewohnheit, sich darauf einzulassen . :)
Ein Zitat aus der Dokumentation:
Verwenden mehrerer Befehle und bedingter Verarbeitungssymbole
Sie können mehrere Befehle über eine einzige Befehlszeile oder ein Skript mithilfe von Symbolen für die bedingte Verarbeitung ausführen. Wenn Sie mehrere Befehle mit Symbolen für die bedingte Verarbeitung ausführen, basieren die Befehle rechts neben dem Symbol für die bedingte Verarbeitung auf den Ergebnissen des Befehls links vom Symbol für die bedingte Verarbeitung.
Beispielsweise möchten Sie einen Befehl möglicherweise nur ausführen, wenn der vorherige Befehl fehlschlägt. Oder Sie möchten einen Befehl möglicherweise nur ausführen, wenn der vorherige Befehl erfolgreich ist.
Sie können die in der folgenden Tabelle aufgeführten Sonderzeichen verwenden, um mehrere Befehle zu übergeben.
& [...]
command1 & command2
Verwenden Sie diese Option, um mehrere Befehle in einer Befehlszeile zu trennen. Cmd.exe führt den ersten Befehl und dann den zweiten Befehl aus.
&& [...]
command1 && command2
Verwenden Sie diese Option, um den Befehl nach && nur auszuführen, wenn der Befehl vor dem Symbol erfolgreich ist. Cmd.exe führt den ersten Befehl und dann den zweiten Befehl nur aus, wenn der erste Befehl erfolgreich ausgeführt wurde.
|| [...]
command1 || command2
Verwenden Sie diese Option, um den folgenden Befehl auszuführen || nur wenn der Befehl vor || steht schlägt fehl. Cmd.exe führt den ersten Befehl und dann den zweiten Befehl nur aus, wenn der erste Befehl nicht erfolgreich ausgeführt wurde (erhält einen Fehlercode größer als Null).
( ) [...]
(command1 & command2)
Verwenden Sie diese Option, um mehrere Befehle zu gruppieren oder zu verschachteln.
; or ,
command1 parameter1;parameter2
Verwenden Sie diese Option, um Befehlsparameter zu trennen.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
arbeitete ohne Anführungszeichen unter Windows 10.
&
- macht es asynchron und läuft beide parallel. Ich steckte fest, weil ich &&
mit verwendet habe, ist synchron und fährt nur fort, wenn das erste erfolgreich ist!
&
macht die Befehle nicht asynchron oder parallel. command1 & command2
wird ausgeführt, command2
nachdem command1
abgeschlossen wurde. Der Erfolg oder Misserfolg von command1
ist irrelevant.
&
ist das Bash-Äquivalent für ;
(Befehle ausführen) und &&
das Bash-Äquivalent von &&
(Befehle ausführen nur, wenn der vorherige keinen Fehler verursacht hat).
;
in Linux gesehen
;
bedeutet, den ersten Befehl auszuführen, auf den Abschluss zu warten und dann den zweiten Befehl auszuführen. &
bedeutet, den ersten Befehl auszuführen, ihn in den Hintergrund zu stellen und den zweiten Befehl auszuführen. Beide Programme werden also gleichzeitig gestartet. Beachten Sie, dass diese keine Symbole kombinieren, sondern nach dem ersten Befehl ablaufen. Sie können einen einzelnen Befehl im Hintergrund mit starten, progname &
ohne einen zweiten Befehl zu haben.
Sie können & verwenden, um Befehle nacheinander auszuführen. Beispiel:c:\dir & vim myFile.txt
Wenn Sie eine Cmd-Verknüpfung erstellen möchten (z. B. auf Ihrem Desktop), fügen Sie den Parameter / k hinzu (/ k bedeutet behalten, / c schließt das Fenster):
cmd /k echo hello && cd c:\ && cd Windows
Sie können call verwenden , um das Problem zu überwinden, dass Umgebungsvariablen zu früh ausgewertet werden - z
set A=Hello & call echo %A%
echo
wird der alte Wert und nicht der neue Wert ausgedruckt. Zumindest beobachte ich dies auf meiner Windows 7-Box.
setlocal EnableDelayedExpansion
in einem Skript oder cmd /v
). Zum Beispiel : timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
Eine Reihe von Verarbeitungssymbolen kann verwendet werden, wenn mehrere Befehle in derselben Zeile ausgeführt werden. In einigen Fällen kann dies zu einer Verarbeitungsumleitung führen, in anderen Fällen zu einer Änderung der Ausgabe oder einfach zum Fehlschlagen. Ein wichtiger Fall ist das Platzieren von Befehlen in derselben Zeile, mit denen Variablen bearbeitet werden.
@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!
0 1
Wie Sie im obigen Beispiel sehen, müssen Sie, wenn Befehle mit Variablen in derselben Zeile platziert werden, die verzögerte Erweiterung verwenden, um Ihre Variablenwerte zu aktualisieren. Wenn Ihre Variable indiziert ist, verwenden Sie den Befehl CALL mit den Modifikatoren %%, um ihren Wert in derselben Zeile zu aktualisieren:
set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%
path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
Also habe ich versucht, die spezifische Aufgabe des Ausführens RegAsm
(Registerassemblierung) über ein Kontextmenü zu aktivieren . Das Problem, das ich hatte, war, dass das Ergebnis aufblitzen und verschwinden würde, bevor ich es lesen konnte. Also habe ich versucht, eine Weiterleitung an Pause
, was nicht funktioniert, wenn der Befehl fehlschlägt (wie hier erwähnt. Der Befehl Pause funktioniert nicht im .bat-Skript und hier funktioniert der Batch-Datei-Befehl PAUSE nicht ). Also habe ich es versucht, cmd /k
aber das lässt das Fenster für weitere Befehle offen (ich möchte nur das Ergebnis lesen). Also habe ich der Kette ein pause
gefolgt von hinzugefügt exit
, was Folgendes ergibt:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
Dies funktioniert wie ein Zauber - RegAsm wird für die Datei ausgeführt und zeigt die Ergebnisse an. Anschließend wird die Eingabeaufforderung "Drücken Sie eine beliebige Taste, um fortzufahren ..." angezeigt. Das Eingabeaufforderungsfenster wird geschlossen, wenn eine Taste gedrückt wird.
PS Für andere, die interessiert sein könnten, können Sie die folgenden .reg-Dateieinträge verwenden, um DLL-Dateien eine DLL-Dateizuordnung und anschließend eine RegAsm-Befehlserweiterung hinzuzufügen (beachten Sie die maskierten Anführungszeichen und Backslashes):
[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"
Jetzt habe ich ein schönes Rechtsklick-Menü, um eine Baugruppe zu registrieren.
Ich versuche, zwei Pings im selben Fenster zu haben, und es ist ein serieller Befehl in derselben Zeile. Führen Sie nach Abschluss des ersten Befehls den zweiten Befehl aus.
Die Lösung bestand darin, mit start /b
einer Windows 7-Eingabeaufforderung zu kombinieren .
Starten Sie wie gewohnt ohne /b
und starten Sie in einem separaten Fenster.
Der Befehl zum Starten in derselben Zeile lautet:
start /b command1 parameters & command2 parameters
Wenn Sie die Ausgabe analysieren möchten, empfehle ich auf keinen Fall, diese zu verwenden. Ich habe festgestellt, dass die Ausgabe zwischen der Ausgabe der Befehle verschlüsselt ist.
Nun, Sie haben zwei Möglichkeiten: Rohrleitungen oder einfach &
:
DIR /S & START FILE.TXT
Oder,
tasklist | find "notepad.exe"
Piping ( |
) dient eher dazu, die Ausgabe eines Befehls in einen anderen zu übernehmen. Und ( &
) sagt nur, lauf dies und das.
&
und was sie |
tun und wie sie sich unterscheiden, wenn überhaupt? Derzeit können Personen, die mit diesen Konzepten nicht vertraut sind, nicht selbst entscheiden, welches in ihren Fällen verwendet werden soll.
Nein cd / && tree && echo %time%
. Die Echozeit ist der Zeitpunkt, zu dem der erste Befehl ausgeführt wird.
Die Rohrleitungen haben einige Probleme, sind jedoch nicht kritisch, solange die Leute wissen, wie sie funktionieren.
Noch ein Beispiel: Zum Beispiel, wenn wir das gulp
Build-System anstelle von verwenden
gulp
- Standard> Build
gulp build
- Build-Ordner erstellen
gulp watch
- Starten Sie die Dateiüberwachung
gulp dist
- dist-Ordner erstellen
Wir können das mit einer Zeile machen:
cd c:\xampp\htdocs\project & gulp & gulp watch
Wenn Sie versuchen, Variablen in einer Zeile zu verwenden oder zu manipulieren, achten Sie auf deren Inhalt! ZB eine Variable wie die folgende
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
kann zu vielen unhandlichen Problemen führen, wenn Sie es als verwenden %PATH%
%PATH%
das Problem in Klammern nicht behandeln%USERPROFILE%
enthalten?Ja da ist. Es ist &
.
&&
führt Befehl 2 aus, wenn Befehl 1 abgeschlossen ist, sofern er nicht fehlgeschlagen ist.
&
wird trotzdem ausgeführt.
Verwenden Sie das &
Symbol in Fenstern, um den Befehl in einer Zeile zu verwenden
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
wie unter Linux verwenden wir,
touch thisfile ; ls -lstrh
Es ist ganz einfach: Unterscheiden Sie sie einfach mit &&
Zeichen. Beispiel:
echo "Hello World" && echo "GoodBye World".
"Goodbye World" wird nach "Hello World" gedruckt.
&&
ist ein bedingter Operator, der nächste Befehl wird nur ausgeführt, wenn der erste Befehl erfolgreich war (errorlevel = 0)
Hello World
nicht fehlgeschlagen ist. wie @jeb gesagt hat, &&
ist bedingt. &
führt Befehle aus, unabhängig davon, ob der vorherige erfolgreich war oder nicht.