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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow