Chcę uruchomić dwa polecenia w konsoli CMD systemu Windows.
W Linuksie zrobiłbym to w ten sposób
touch thisfile ; ls -lstrh
Jak to się robi w systemie Windows?
Chcę uruchomić dwa polecenia w konsoli CMD systemu Windows.
W Linuksie zrobiłbym to w ten sposób
touch thisfile ; ls -lstrh
Jak to się robi w systemie Windows?
Odpowiedzi:
Podobnie jak we wszystkich systemach operacyjnych Microsoft od 2000 roku, i nadal jest dobry:
dir & echo foo
Jeśli chcesz, aby drugie polecenie zostało wykonane tylko wtedy, gdy pierwsze zakończyło się pomyślnie:
dir && echo foo
Pojedyncza składnia ampersand (&) służąca do wykonywania wielu poleceń w jednym wierszu sięga systemu Windows XP, Windows 2000 i niektórych wcześniejszych wersji NT. (Przynajmniej 4.0, według jednego komentatora tutaj.)
Jest jeszcze kilka innych punktów na ten temat, które przewijają się w dół tej strony.
Dane historyczne dla tych, którzy mogą uznać je za edukacyjne.
Wcześniej składnia && była tylko funkcją wymiany powłoki 4DOS, zanim ta funkcja została dodana do interpretera poleceń Microsoft.
W systemach Windows 95, 98 i ME zamiast tego należy użyć znaku potoku:
dir | echo foo
W MS-DOS 5.0 i nowszych wersjach, w niektórych wcześniejszych wersjach interpretera poleceń dla Windows i NT, (nieudokumentowanym) separatorem poleceń był znak 20 (Ctrl + T), który będę tutaj reprezentował ^ T.
dir ^T echo foo
cmd
natychmiastowym, więc przypuszczam, że nie jest to zły nawyk wchodzenia w to. :)
Cytat z dokumentacji:
Korzystanie z wielu poleceń i symboli przetwarzania warunkowego
Możesz uruchamiać wiele poleceń z jednego wiersza polecenia lub skryptu, używając symboli przetwarzania warunkowego. Po uruchomieniu wielu poleceń z symbolami przetwarzania warunkowego polecenia po prawej stronie symbolu przetwarzania warunkowego działają w oparciu o wyniki polecenia po lewej stronie symbolu przetwarzania warunkowego.
Na przykład możesz chcieć uruchomić polecenie tylko wtedy, gdy poprzednie polecenie nie powiedzie się. Lub możesz uruchomić polecenie tylko wtedy, gdy poprzednie polecenie zakończyło się powodzeniem.
Możesz użyć znaków specjalnych wymienionych w poniższej tabeli, aby przekazać wiele poleceń.
& [...]
command1 & command2
Służy do oddzielania wielu poleceń w jednym wierszu poleceń. Cmd.exe uruchamia pierwsze polecenie, a następnie drugie polecenie.
&& [...]
command1 && command2
Służy do uruchamiania polecenia następującego po && tylko wtedy, gdy polecenie poprzedzające symbol zakończyło się powodzeniem. Cmd.exe uruchamia pierwsze polecenie, a następnie uruchamia drugie polecenie tylko wtedy, gdy pierwsze polecenie zakończy się pomyślnie.
|| [...]
command1 || command2
Użyj, aby uruchomić polecenie następujące || tylko jeśli polecenie poprzedzające || zawodzi. Cmd.exe uruchamia pierwsze polecenie, a następnie uruchamia drugie polecenie tylko wtedy, gdy pierwsze polecenie nie zakończyło się pomyślnie (otrzymuje kod błędu większy niż zero).
( ) [...]
(command1 & command2)
Służy do grupowania lub zagnieżdżania wielu poleceń.
; or ,
command1 parameter1;parameter2
Służy do oddzielania parametrów poleceń.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
działał bez cudzysłowów w systemie Windows 10.
&
- czyni go asynchronicznym i działa równolegle. Utknąłem, ponieważ korzystałem &&
z jest synchroniczne i kontynuuje tylko, jeśli pierwszy się powiedzie!
&
nie czyni poleceń asynchronicznymi ani równoległymi. command1 & command2
uruchomi się command2
po command1
zakończeniu. Sukces lub porażka nie command1
ma znaczenia.
&
jest odpowiednikiem Bash dla ;
(uruchom polecenia) i &&
jest odpowiednikiem Bash &&
(uruchom polecenia tylko wtedy, gdy poprzednie nie spowodowało błędu).
;
w Linuksie
;
oznacza uruchomienie pierwszego polecenia, poczekaj na jego zakończenie, a następnie uruchom drugie polecenie. &
oznacza uruchomienie pierwszego polecenia, umieszczenie go w tle i uruchomienie drugiego polecenia. Oba programy uruchamiają się jednocześnie. Zauważ, że nie łączą one symboli, lecz kończą się symbolami do pierwszego polecenia; możesz uruchomić pojedyncze polecenie w tle progname &
bez drugiego polecenia.
Jeśli chcesz utworzyć skrót cmd (na przykład na pulpicie) dodaj parametr / k (/ k oznacza zachowaj, / c zamknie okno):
cmd /k echo hello && cd c:\ && cd Windows
Możesz użyć wywołania, aby rozwiązać problem zbyt wczesnej oceny zmiennych środowiskowych - np
set A=Hello & call echo %A%
echo
wypisuje starą wartość, a nie nową. Przynajmniej to obserwuję na moim pudełku Windows 7.
setlocal EnableDelayedExpansion
w skrypcie lub cmd /v
). Na przykład: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
Szereg przetwarzania symboli może być używany podczas uruchamiania kilku poleceń na tej samej linii, co może prowadzić do przekierowania przetwarzania w niektórych przypadkach zmiany wyjście w innym przypadku, lub po prostu zawodzą. Jednym ważnym przypadkiem jest umieszczenie w tym samym poleceniu linii, które manipuluje zmiennymi.
@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!
0 1
Jak widać w powyższym przykładzie, gdy polecenia korzystające ze zmiennych są umieszczone w tym samym wierszu, należy użyć opóźnionego rozwinięcia, aby zaktualizować wartości zmiennych. Jeśli twoja zmienna jest indeksowana, użyj polecenia CALL z modyfikatorami %%, aby zaktualizować jej wartość w tym samym wierszu:
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!%"
Próbowałem więc włączyć określone zadanie uruchamiania RegAsm
(rejestracja zestawu) z menu kontekstowego. Problem polegał na tym, że wynik migał i znikał, zanim mogłem go przeczytać. Więc próbowałem potokowania do Pause
, który nie działa, gdy polecenie nie powiedzie się (jak wspomniano tutaj polecenie Wstrzymaj nie działa w skrypcie .bat i tutaj polecenie pliku wsadowego PAUSE nie działa ). Więc próbowałem, cmd /k
ale to pozostawia otwarte okno na więcej poleceń (chcę tylko przeczytać wynik). Dlatego dodaje się pause
następnie exit
do sieci, co prowadzi do następujących:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
Działa to jak urok - RegAsm uruchamia się na pliku i pokazuje jego wyniki, a następnie pojawia się monit „Naciśnij dowolny klawisz, aby kontynuować ...”, a okno wiersza polecenia zamyka się po naciśnięciu klawisza.
PS W przypadku innych osób, które mogą być zainteresowane, możesz użyć następujących wpisów pliku .reg, aby dodać skojarzenie pliku dll do plików .dll, a następnie rozszerzenie polecenia RegAsm (zwróć uwagę na cytowane znaki cudzysłowu i ukośniki odwrotne):
[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"
Teraz mam ładne menu prawym przyciskiem myszy, aby zarejestrować zespół.
Próbuję mieć dwa pingi w tym samym oknie i jest to polecenie szeregowe w tym samym wierszu. Po zakończeniu pierwszego uruchom drugie polecenie.
Rozwiązaniem było połączenie z start /b
wierszem poleceń systemu Windows 7.
Zacznij jak zwykle bez /b
i uruchom w osobnym oknie.
Polecenie użyte do uruchomienia w tym samym wierszu to:
start /b command1 parameters & command2 parameters
W każdym razie, jeśli chcesz przeanalizować dane wyjściowe, nie polecam tego używać. Zauważyłem, że dane wyjściowe są zakodowane między danymi wyjściowymi poleceń.
Masz dwie opcje: orurowanie lub po prostu &
:
DIR /S & START FILE.TXT
Lub,
tasklist | find "notepad.exe"
Piping ( |
) służy bardziej do pobierania danych wyjściowych jednego polecenia i umieszczania go w innym. I ( &
) mówi tylko „uruchom to i tamto”.
&
i |
robić i jak różnią się one, jeśli w ogóle? W tej chwili ludzie niezaznajomieni z tymi pojęciami nie są w stanie samodzielnie zdecydować, które z nich należy zastosować w ich przypadkach.
Nie cd / && tree && echo %time%
. Czas echa jest w chwili wykonania pierwszego polecenia.
Rurociągi mają pewien problem, ale nie są krytyczne, dopóki ludzie wiedzą, jak to działa.
Jeszcze jeden przykład: na przykład, gdy używamy gulp
systemu kompilacji zamiast
gulp
- domyślnie> build
gulp build
- build-build-folder
gulp watch
- rozpocznij oglądanie plików
gulp dist
- buduj folder dist
Możemy to zrobić za pomocą jednej linii:
cd c:\xampp\htdocs\project & gulp & gulp watch
Kiedy próbujesz używać lub manipulować zmiennymi w jednym wierszu, strzeż się ich zawartości! Np. Zmienna taka jak poniżej
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
może powodować wiele nieprzyjemnych problemów, jeśli użyjesz go jako %PATH%
%PATH%
na obsługę problemu z nawiasami%USERPROFILE%
zawierać zmienna, do której istnieje odwołanie ?Tak jest. Jest &
.
&&
wykona polecenie 2 po zakończeniu polecenia 1, pod warunkiem, że nie zakończyło się ono niepowodzeniem.
&
wykona się niezależnie.
Użyj &
symbolu w systemie Windows, aby użyć polecenia w jednym wierszu
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
jak w Linuksie, którego używamy,
touch thisfile ; ls -lstrh
To proste: wystarczy odróżnić je &&
znakami. Przykład:
echo "Hello World" && echo "GoodBye World".
„Goodbye World” zostanie wydrukowany po „Hello World”.
&&
jest operatorem warunkowym , następne polecenie jest wykonywane tylko wtedy, gdy pierwsze polecenie powiodło się (poziom błędu = 0)
Hello World
nie zakończy się niepowodzeniem. jak powiedział @jeb, &&
jest warunkowe. &
uruchamia polecenia niezależnie od tego, czy poprzednie zakończyło się powodzeniem, czy nie.