Wiele poleceń w jednym wierszu w pliku wsadowym systemu Windows

111

W systemie Unix możemy umieścić wiele poleceń w jednej linii, na przykład:

$ date ; ls -l ; date

Próbowałem podobnej rzeczy w systemie Windows:

 > echo %TIME% ; dir ; echo %TIME

Ale wypisuje godzinę i nie wykonuje polecenia dir.

Jak mogę to osiągnąć?

Raghuram
źródło

Odpowiedzi:

181

Posługiwać się:

echo %time% & dir & echo %time%

Jest to, z pamięci, odpowiednik separatora średnika w bashi innych powłokach UNIXy.

Istnieje również &&(lub ||), który wykonuje drugie polecenie tylko wtedy, gdy pierwsze powiedzie się (lub nie powiodło się), ale pojedynczy znak ampersand &jest tym, czego tutaj szukasz.


Prawdopodobnie da ci to ten sam czas, ponieważ zmienne środowiskowe są zwykle oceniane podczas odczytu, a nie wykonywania.

Możesz to obejść, włączając opóźnioną ekspansję:

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

Jest to potrzebne z wiersza poleceń. Jeśli robisz to wewnątrz skryptu, możesz po prostu użyć setlocal:

@setlocal enableextensions enabledelayedexpansion
@echo off
echo !time! & ping 127.0.0.1 >nul: & echo !time!
endlocal
paxdiablo
źródło
Dziękuję za odpowiedź. Problem w tym, że działa częściowo. pierwszy i ostatni% time% drukuje w tym samym czasie, nawet jeśli wykonanie polecenia (w środku) zajmuje co najmniej 40 sekund. (uruchamiam skrypt zamiast polecenia dir)
Raghuram
1
Dzieje się tak, ponieważ zmienne środowiskowe są oceniane, gdy polecenie jest odczytywane, a nie wykonywane. Zaktualizuję odpowiedź.
paxdiablo
Nadal problem nadal występuje. Skrypt kończy pracę z kodem 1. Ale nadal drugie echo jest drukowane w tym samym czasie. Zobacz operację 12: 57: 56.93 Wątek zakończył działanie, gdy były uruchomione 3 wątki. 12:57: 56.93
Raghuram
3
Zwykłem używać time /t(lub echo.|time) zamiast echo %time%ominąć problem.
Joey,
1
Masz jakiś pomysł, jak sprawić, by% errorlevel% był poprawny podczas kolejnych wywołań?
BradLaney