batch-file
Najlepsze praktyki
Szukaj…
Wprowadzenie
W tym temacie skoncentrujemy się na rzeczach, które należy (nieobowiązkowo) zrobić w pliku wsadowym. Korzystanie z tych „najlepszych praktyk” może poprawić efekt i działanie pliku wsadowego.
cytaty
Większość internetowych skryptów wsadowych zawiera wiele problemów z wyceną.
Przykłady i rozwiązania
Przykład A
if %var%==abc echo Test
Ten kod działa - gdy zawartość %var%
nie zawiera spacji ani innych znaków specjalnych. Załóżmy teraz, że %var%
zawiera 1 spację. Teraz cmd.exe
widzi:
if ==abc echo Test
Spowodowałoby to awarię, ponieważ cmd.exe
nie rozumie tej składni.
Rozwiązanie A
if "%var%"=="abc" echo Test
Używając cudzysłowów, cmd.exe
widzi cały %var%
(łącznie ze spacją i znakami specjalnymi) jako tylko jeden normalny ciąg. Nie jest to jednak najbezpieczniejsza metoda porównywania. Najbezpieczniejszy używa echo
, pipe
i findstr
.
Przykład B
cd C:\User\Spaced Name\Spaced FileName.txt
cd
zmieniłby katalog tylko na C:\User\Spaced
, ponieważ cd
akceptuje tylko jeden argument ścieżki.
Rozwiązanie B
Po prostu poprzez dodanie cudzysłowów na ścieżce problem zostałby rozwiązany.
cd "C:\User\Spaced Name\Spaced FileName.txt"
Istnieje również kilka przykładów, które działają lepiej przy użyciu cudzysłowów, takich jak instrukcja set /a
itp. Ale gdy pracujemy na ciągach zawierających spacje lub znaki specjalne, zwykle stosowanie cudzysłowów jest znacznie bezpieczniejsze.
Kod Spaghetti
Kod spaghetti oznacza fragment kodu, który wykorzystuje wiele często mylących struktur. Takie jak GOTO
, wyjątki i niespójny kod.
Przykłady i rozwiązania
Przykład A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Ten program zawiera wiele skoków, przez co trudniej jest nam wiedzieć, co dokładnie robi skrypt.
Rozwiązanie A
@echo off
for /l %%G in (0,1,10) echo %%G
Używając mniej GOTO
, znacznie zmniejszyliśmy ilość kodu i możemy skupić się na rzeczywistym kodzie.
Przykład B
Rozważ następujące stwierdzenia.
:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie
:player1wins
echo player 1 wins
goto :eof
:player2wins
echo player 2 wins
goto :eof
:tie
echo tie
goto :eof
Ten fragment wymaga wielu goto
i może być mylący przy debugowaniu. Aby uprościć te instrukcje, możemy użyć polecenia call
. Oto powyższy skrypt w lepszym stanie.
:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie
goto :eof
:message
echo %*
goto :eof
Oba skrypty generują dokładnie ten sam wynik, ale nowy skrypt jest znacznie krótszy i wyraźniejszy.