batch-file länge - Wie führe ich zwei Befehle in einer Zeile in Windows CMD aus?




für meta (14)

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

Unter Linux würde ich das so machen: touch thisfile ; ls -lstrh diese touch thisfile ; ls -lstrh touch thisfile ; ls -lstrh .

Wie läuft es unter Windows?


Answers

Nun, Sie haben zwei Möglichkeiten: Piping oder einfach & :

DIR /S & START FILE.TXT

Oder,

tasklist | find "notepad.exe"

Piping ( | ) ist mehr dazu da, die Ausgabe eines Befehls zu übernehmen und in einen anderen zu setzen. Und ( & ) sagt nur das und das.


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 nicht handhabbaren Problemen führen, wenn Sie es als %PATH%

  1. Die abschließenden Klammern beenden Ihre Gruppenaussage
  2. Die doppelten Anführungszeichen erlauben es nicht, %PATH% zu verwenden, um das Klammernproblem zu behandeln
  3. Und was wird eine referenzierte Variable wie %USERPROFILE% enthalten?

cmd /c ipconfig /all & Output.txt

Dieser Befehl führt den Befehl aus und Output.txt Datei Output.txt in einem einzigen Befehl


Wenn Sie eine Cmd-Verknüpfung erstellen möchten (zum Beispiel auf Ihrem Desktop), fügen Sie den Parameter / k hinzu (/ k bedeutet halten, / c schließt das Fenster):

cmd /k echo hello && cd c:\ && cd Windows

Ich versuche, zwei Pings im selben Fenster zu haben, und es ist ein serieller Befehl in derselben Zeile. Nachdem Sie den ersten Befehl ausgeführt haben, führen Sie den zweiten Befehl aus.

Die Lösung sollte mit start /b an einer Windows 7-Eingabeaufforderung kombiniert werden.

Starten Sie wie gewohnt ohne /b und starten Sie sie in einem separaten Fenster.

Der Befehl zum Starten in derselben Zeile lautet:

start /b command1 parameters & command2 parameters

In jedem Fall, wenn Sie die Ausgabe analysieren möchten, empfehle ich nicht, dies zu verwenden. Ich habe bemerkt, dass die Ausgabe zwischen den Ausgaben der Befehle verschlüsselt ist.


Ein weiteres Beispiel: Zum Beispiel, wenn wir das gulp Build-System anstelle von verwenden

gulp - Standard> Build

gulp build - Build Build-Ordner

gulp watch - Dateiüberwachung starten

gulp dist - bilde dist-folder

Wir können das mit einer Linie machen:

cd c:\xampp\htdocs\project & gulp & gulp watch

Nein, cd / && tree && echo %time% . Die Echozeit liegt bei der Ausführung des ersten Befehls.

Die Rohrleitung hat ein Problem, aber es ist nicht kritisch, solange die Leute wissen, wie es funktioniert.


Ein Zitat aus der Dokumentation:

Verwenden mehrerer Befehle und bedingter Verarbeitungssymbole

Sie können mehrere Befehle über eine einzige Befehlszeile oder ein einzelnes Skript mit bedingten Verarbeitungssymbolen ausführen. Wenn Sie mehrere Befehle mit bedingten Verarbeitungssymbolen ausführen, wirken die Befehle rechts vom Symbol für bedingte Verarbeitung basierend auf den Ergebnissen des Befehls links vom bedingten Verarbeitungssymbol.

Beispielsweise möchten Sie möglicherweise nur einen Befehl ausführen, wenn der vorherige Befehl fehlschlägt. Oder Sie möchten einen Befehl nur ausführen, wenn der vorherige Befehl erfolgreich ausgeführt wurde.

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 diesen Befehl, um den Befehl nach && nur dann auszuführen, wenn der Befehl vor dem Symbol erfolgreich ist. Cmd.exe führt den ersten Befehl aus und führt den zweiten Befehl nur dann aus, wenn der erste Befehl erfolgreich ausgeführt wurde.

  • || [...]
    command1 || command2
    Verwenden Sie, um den Befehl nach || auszuführen nur wenn der Befehl vor || schlägt fehl. Cmd.exe führt den ersten Befehl aus und führt dann den zweiten Befehl nur aus, wenn der erste Befehl nicht erfolgreich abgeschlossen wurde (empfängt einen Fehlercode größer als Null).

  • ( ) [...]
    (command1 & command2)
    Verwenden Sie diese Option zum Gruppieren oder Verschachteln mehrerer Befehle.

  • ; or ,
    command1 parameter1;parameter2
    Verwenden Sie, um Befehlsparameter zu trennen.


Eine Anzahl von Verarbeitungssymbolen kann verwendet werden, wenn mehrere Befehle in derselben Zeile ausgeführt werden, und kann in einigen Fällen zur Verarbeitungsumleitung führen, in anderen Fällen die Ausgabe ändern oder einfach fehlschlagen. Ein wichtiger Fall ist es, auf dieselbe Zeile Befehle zu setzen, die Variablen manipulieren.

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

Wie Sie im obigen Beispiel sehen, wenn Befehle, die Variablen verwenden, in derselben Zeile platziert sind, müssen Sie die verzögerte Erweiterung verwenden, um Ihre Variablenwerte zu aktualisieren. Wenn Ihre Variable indiziert ist, verwenden Sie den Befehl CALL mit %%-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

So auf allen Microsoft-Betriebssystemen seit 2000, und immer noch gut heute:

dir & echo foo

Wenn der zweite Befehl nur ausgeführt werden soll, wenn der erste erfolgreich beendet wurde:

dir && echo foo

Die einzelne Ampersand (&) -Syntax zum Ausführen mehrerer Befehle in einer Zeile geht auf Windows XP, Windows 2000 und einige frühere NT-Versionen zurück. (Mindestens 4.0, nach einem Kommentar hier.)

Es gibt noch einige andere Punkte, die Sie auf dieser Seite finden.

Historische Daten folgen für diejenigen, die es lehrreich finden.

Davor war die Syntax && nur ein Merkmal der Shell-Ersetzung von 4DOS, bevor diese Funktion dem Microsoft-Befehlsinterpreter hinzugefügt wurde.

In Windows 95, 98 und ME würden Sie stattdessen das Pipe-Zeichen verwenden:

dir | echo foo

In MS-DOS 5.0 und höher, über einige frühere Windows- und NT-Versionen des Befehlsinterpreters, war das (undokumentierte) Befehlstrennzeichen das Zeichen 20 (Strg + T), das ich hier mit ^ T darstellen werde.

dir ^T echo foo

Also, ich habe versucht, die spezifische Aufgabe der RegAsm (Register Assembly) aus einem Kontextmenü zu aktivieren. Das Problem, das ich hatte, war, dass das Ergebnis aufleuchten und verschwinden würde, bevor ich es lesen konnte. Also habe ich versucht, zu Pause , was nicht funktioniert, wenn der Befehl fehlschlägt (wie hier erwähnt Pause-Befehl nicht in .bat-Skript funktioniert und hier Batch-Datei Befehl PAUSE nicht funktioniert ). Also habe ich cmd /k ausprobiert, aber das lässt das Fenster offen für weitere Befehle (ich möchte nur das Ergebnis lesen). Also fügte ich eine pause hinzu, gefolgt vom exit der Kette, was zu folgendem führte:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

Das funktioniert wie ein Zauber - RegAsm läuft auf der Datei und zeigt ihre Ergebnisse, dann wird eine Eingabeaufforderung "Drücken Sie eine beliebige Taste, um fortzufahren ..." angezeigt, dann wird das Eingabeaufforderungsfenster 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 dllfile-Zuordnung hinzuzufügen und dann eine RegAsm-Befehlserweiterung (beachte die quittierten 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 nettes Kontextmenü, um eine Baugruppe zu registrieren.


& ist das Bash-Äquivalent für ; (run commands) und && ist das Bash-Äquivalent von && (nur Befehle ausführen, wenn das vorherige keinen Fehler verursacht hat).


Mit call können Sie das Problem der zu früh evaluierten Umgebungsvariablen - z

set A=Hello & call echo %A%

Ich habe ein Powerbasic-Programm wait.exe geschrieben , dem Sie in Ihrer Batch-Datei einen Millisekunden-Parameter übergeben

wait 3000
system('c:/windows/system32/SnippingTool.exe')

der Code für die EXE:

FUNCTION PBMAIN()
  c$ = Command$
  s! = Val(c$)*1000
  Sleep s!         
END FUNCTION






windows batch-file command-line cmd