Wie führe ich in Windows CMD zwei Befehle in einer Zeile aus?

961

Ich möchte zwei Befehle in einer Windows CMD-Konsole ausführen.

Unter Linux würde ich das so machen

touch thisfile ; ls -lstrh

Wie geht das unter Windows?

Flybywire
quelle

Antworten:

1321

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
djdanlib
quelle
26
Zumindest bis NT 4.
Joey
17
Funktioniert auch unter Win 8.0 und 8.1.
MEMark
5
@Fallenreaper, das funktioniert auch in der direkten cmdEingabeaufforderung, also ist es wohl keine schlechte Angewohnheit, sich darauf einzulassen . :)
6
@Fallenreaper Stellen Sie sicher, dass Sie sich des praktischen Unterschieds zwischen beiden bewusst sind: Siehe Raihans Antwort unten.
Moshe Katz
8
Verstanden. A & B, B wird nur ausgeführt, wenn A erfolgreich ist, während A & B B nach A ausführen, unabhängig vom Ergebnis von A. Vielen Dank für die Heads-Ups
Fallenreaper
579

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.

Raihan
quelle
41
Versuchen Sie es cmd /c "echo foo & echo bar".
Raihan
2
vagrant up && vagrant ssharbeitete ohne Anführungszeichen unter Windows 10.
furman87
Vielen Dank! Ich wusste nichts über Singe &- 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!
TetraDev
1
Dokumentationslink defekt, neuer Standort technet.microsoft.com/en-us/library/bb490954.aspx
nkef
7
@TetraDev &macht die Befehle nicht asynchron oder parallel. command1 & command2wird ausgeführt, command2 nachdem command1 abgeschlossen wurde. Der Erfolg oder Misserfolg von command1ist irrelevant.
geboren
74

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

Manojlds
quelle
1
Dies gilt auch für csh, tcsh und viele weitere Shells. Ich habe noch nie ;in Linux gesehen
phuclv
10
@ LưuVĩnhPhúc in Sh-Shells ;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.
MM
25

Sie können & verwenden, um Befehle nacheinander auszuführen. Beispiel:c:\dir & vim myFile.txt

verschrottete Cola
quelle
19

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
TroodoN-Mike
quelle
16

Sie können call verwenden , um das Problem zu überwinden, dass Umgebungsvariablen zu früh ausgewertet werden - z

set A=Hello & call echo %A%
SSi
quelle
1
Dies funktioniert nur, wenn die Variable noch nicht festgelegt ist. In diesem Fall echowird der alte Wert und nicht der neue Wert ausgedruckt. Zumindest beobachte ich dies auf meiner Windows 7-Box.
Craig M. Brandenburg
Ich benutze zuerst set A =, um sicherzustellen, dass die Variable nicht gesetzt ist.
SSi
1
Eine bessere Methode ist die Verwendung einer verzögerten Erweiterung ( setlocal EnableDelayedExpansionin einem Skript oder cmd /v). Zum Beispiel : timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick
5
Verwenden Sie ^ nach dem ersten Prozent, um den neuen Wert zu erhalten: Setzen Sie A = Hallo und rufen Sie echo% ^ A%
Nicolas
9

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
sambul35
quelle
gegebenes Beispiel hat bei mir nicht funktioniert, aber unten hat es funktioniert:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw
8

cmd /c ipconfig /all & Output.txt

Dieser Befehl führt den Befehl aus und öffnet die Output.txtDatei in einem einzigen Befehl

dpp.2325
quelle
8

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 /kaber das lässt das Fenster für weitere Befehle offen (ich möchte nur das Ergebnis lesen). Also habe ich der Kette ein pausegefolgt 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.

SNAFUBAR
quelle
4

Um zwei Befehle gleichzeitig auszuführen, müssen Sie ein & (kaufmännisches Und) zwischen die beiden Befehle setzen. Wie so:

color 0a & start chrome.exe

Prost!

PryroTech
quelle
4

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 /beiner Windows 7-Eingabeaufforderung zu kombinieren .

Starten Sie wie gewohnt ohne /bund 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.

sdcxp
quelle
4

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.

PyDever
quelle
Könnten Sie Ihren Beitrag so bearbeiten, dass er erklärt, was &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.
Mirek Długosz
Wie ich war. Mein Fehler. Ich werde den Beitrag sofort bearbeiten. Bin dankbar.
PyDever
Sollte "findstr" statt nur "find" sein
Anu Shibin Joseph Raj
2

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.

notarieller Name
quelle
1

Noch ein Beispiel: Zum Beispiel, wenn wir das gulpBuild-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
Meile Mijatović
quelle
1

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%

  1. Die schließenden Klammern beenden Ihre Gruppenanweisung
  2. Mit den doppelten Anführungszeichen können Sie %PATH%das Problem in Klammern nicht behandeln
  3. Und wie wird eine referenzierte Variable %USERPROFILE%enthalten?
V15I0N
quelle
2
Was hat dies mit der Ausführung von zwei Befehlen in einer Zeile in Windows CMD zu tun?
Peter Mortensen
0

Ja da ist. Es ist &.

&& führt Befehl 2 aus, wenn Befehl 1 abgeschlossen ist, sofern er nicht fehlgeschlagen ist.

& wird trotzdem ausgeführt.

هادی کشاورز Hadi Keshavarz
quelle
0

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
Arshdeep Kharbanda
quelle
-2

Es ist ganz einfach: Unterscheiden Sie sie einfach mit &&Zeichen. Beispiel:

echo "Hello World" && echo "GoodBye World".

"Goodbye World" wird nach "Hello World" gedruckt.

Rajan Dhanowa
quelle
6
Unabhängig davon, dass es bereits alte Antworten gibt, die dasselbe zeigen, ist es immer noch nicht ganz richtig. &&ist ein bedingter Operator, der nächste Befehl wird nur ausgeführt, wenn der erste Befehl erfolgreich war (errorlevel = 0)
jeb
Na sicher. Es ist selbstverständlich, wenn die Person zwei Befehle ausführen möchte, werden diese beiden korrekt sein und somit wird alles gut gehen
Rajan Dhanowa
1
Rajan: Er meint "der nächste Befehl wird nur ausgeführt, wenn der erste Befehl erfolgreich ist".
Ivan
2
" Goodbye World wird nach Hello World gedruckt ", sofern der Druck Hello Worldnicht fehlgeschlagen ist. wie @jeb gesagt hat, &&ist bedingt. &führt Befehle aus, unabhängig davon, ob der vorherige erfolgreich war oder nicht.
Pranav A.