Mehrere Befehle in einer einzelnen Zeile in einer Windows-Batchdatei

111

Unter Unix können wir mehrere Befehle in einer einzigen Zeile wie folgt einfügen:

$ date ; ls -l ; date

Ich habe etwas Ähnliches in Windows versucht:

 > echo %TIME% ; dir ; echo %TIME

Aber es druckte die Zeit und führt den Befehl nicht aus dir.

Wie kann ich das erreichen?

Raghuram
quelle

Antworten:

181

Verwenden:

echo %time% & dir & echo %time%

Dies entspricht aus dem Speicher dem bashSemikolon -Trennzeichen in und anderen UNIXy-Shells.

Es gibt auch &&(oder ||), die den zweiten Befehl nur ausführen, wenn der erste erfolgreich war (oder fehlgeschlagen ist), aber das einzelne kaufmännische Und &ist das, wonach Sie hier suchen.


Dies gibt Ihnen wahrscheinlich die gleiche Zeit, da Umgebungsvariablen eher beim Lesen als beim Ausführen ausgewertet werden.

Sie können dies umgehen, indem Sie die verzögerte Erweiterung aktivieren:

pax> cmd /v:on /c "echo !time! & ping 127.0.0.1 >nul: & echo !time!"
15:23:36.77
15:23:39.85

Das wird über die Kommandozeile benötigt. Wenn Sie dies in einem Skript tun, können Sie einfach Folgendes verwenden setlocal:

@setlocal enableextensions enabledelayedexpansion
@echo off
echo !time! & ping 127.0.0.1 >nul: & echo !time!
endlocal
paxdiablo
quelle
Danke für die Antwort. Das Problem ist, dass es teilweise funktioniert. Das erste und das letzte% time% werden zur gleichen Zeit gedruckt, auch wenn der Befehl (in der Mitte) mindestens 40 Sekunden dauert (ich führe mein Skript anstelle des Befehls dir aus)
Raghuram
1
Dies liegt daran, dass die Umgebungsvariablen ausgewertet werden, wenn der Befehl gelesen und nicht ausgeführt wird. Ich werde die Antwort aktualisieren.
Paxdiablo
Trotzdem bleibt das Problem bestehen. Das Skript wird mit Code 1 beendet. Das zweite Echo wird jedoch gleichzeitig gedruckt. Siehe hierzu op. 12: 57: 56.93 Ein Thread wurde beendet, während 3 Threads ausgeführt wurden. 12: 57: 56.93
Raghuram
3
Ich neigte dazu, time /t(oder echo.|time) zu verwenden, anstatt echo %time%das Problem zu umgehen.
Joey
1
Irgendeine Idee, wie man% errorlevel% bei folgenden Aufrufen korrekt macht?
BradLaney