Istnieje kilka sposobów wykonywania różnych poleceń w tym samym skrypcie bashi za cmdpomocą tego samego skryptu.
cmdzignoruje wiersze zaczynające się od :;, jak wspomniano w innych odpowiedziach. Zignoruje również następną linię, jeśli bieżąca linia kończy się poleceniem rem ^, ponieważ ^znak uniknie końca linii, a następna linia będzie traktowana jako komentarz przez rem.
Jeśli chodzi o bashignorowanie cmdwierszy, istnieje wiele sposobów. Wyliczyłem kilka sposobów, aby to zrobić bez łamania cmdpoleceń:
Nieistniejące #polecenie (niezalecane)
Jeśli po uruchomieniu skryptu nie jest #dostępne żadne polecenie cmd, możemy to zrobić:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
#Charakter na początku cmdmarek linii bashtraktują tę linię jako komentarz.
#Znaków na końcu bashlinii jest używany do ustosunkowania się, \rznak, jak Brian Tompsett wskazał w swojej odpowiedzi . Bez tego bashzgłosi błąd, jeśli plik ma \r\nzakończenia linii, wymagane przez cmd.
W ten # 2>nulsposób oszukujemy, cmdaby zignorować błąd jakiegoś nieistniejącego #polecenia, jednocześnie wykonując następujące polecenie.
Nie używaj tego rozwiązania, jeśli #polecenie jest dostępne na stronie PATHlub jeśli nie masz kontroli nad poleceniami dostępnymi dla cmd.
Używając, echoaby zignorować #włączony znakcmd
Możemy użyć echoz przekierowanym wyjściem do wstawiania cmdpoleceń w bashzakomentowanym obszarze:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Ponieważ #znak nie ma specjalnego znaczenia cmd, jest traktowany jako część tekstu do echo. Wszystko, co musieliśmy zrobić, to przekierować wyjście echopolecenia i wstawić po nim inne polecenia.
Pusty #.batplik
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
echo >/dev/null # 1>nul 2> #.batLinia tworzy pusty #.batplik while on cmd(lub zastępuje istniejące #.bat, jeśli w ogóle), a nie robi nic na while bash.
Plik ten będzie używany przez cmdlinię (S), który następuje, nawet jeśli jest jakaś inna #komenda na PATH.
del #.batPolecenia na cmdkodzie swoistej wobec usuwa plik, który został utworzony. Musisz to zrobić tylko w ostatniej cmdlinii.
Nie używaj tego rozwiązania, jeśli #.batplik może znajdować się w Twoim bieżącym katalogu roboczym, ponieważ zostanie on usunięty.
Zalecane: używanie dokumentu here do ignorowania cmdpoleceń nabash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Umieszczając ^znak na końcu cmdlinii, unikamy podziału wiersza i używając :jako separatora dokumentu w tym miejscu, zawartość linii separatora nie będzie miała wpływu na cmd. W ten sposób cmdwykona swoją linię dopiero po jej zakończeniu :, zachowując się tak samo jak bash.
Jeśli chcesz mieć wiele linii na obu platformach i wykonywać je tylko na końcu bloku, możesz to zrobić:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Dopóki nie ma cmddokładnej linii here-document delimiter, to rozwiązanie powinno działać. Możesz zmienić here-document delimiterna dowolny inny tekst.
We wszystkich przedstawionych rozwiązaniach polecenia będą wykonywane dopiero po ostatniej linii , dzięki czemu ich zachowanie będzie spójne, jeśli zrobią to samo na obu platformach.
Te rozwiązania muszą zostać zapisane w plikach z \r\npodziałem wiersza, w przeciwnym razie nie będą działać cmd.