batch-file
Best Practices
Suche…
Einführung
Dieses Thema konzentriert sich auf die Dinge, die in einer Batchdatei ausgeführt werden sollten (nicht zwingend) . Die Verwendung dieser "Best Practices" kann die Wirkung und Funktion einer Batchdatei verbessern.
Zitate
Die meisten Online-Batch-Skripts enthalten viele Zitatprobleme.
Beispiele und Lösungen
Beispiel A
if %var%==abc echo Test
Dieser Code funktioniert - wenn der Inhalt von %var%
kein Leerzeichen oder andere Sonderzeichen enthält. Nehmen wir nun an, dass %var%
1 Whitespace enthält. Jetzt sieht cmd.exe
:
if ==abc echo Test
Dies würde zu einem Fehler führen, da cmd.exe
diese Syntax nicht versteht.
Lösung A
if "%var%"=="abc" echo Test
Bei Verwendung von Anführungszeichen betrachtet cmd.exe
das gesamte %var%
(einschließlich Leerzeichen und Sonderzeichen) als nur einen normalen String. Dies ist jedoch nicht die sicherste Vergleichsmethode. Der sicherste verwendet echo
, pipe
und findstr
.
Beispiel B
cd C:\User\Spaced Name\Spaced FileName.txt
cd
würde nur das Verzeichnis in C:\User\Spaced
ändern, da cd
nur ein cd
akzeptiert.
Lösung B
Durch einfaches Hinzufügen von Anführungszeichen um den Pfad würde das Problem gelöst.
cd "C:\User\Spaced Name\Spaced FileName.txt"
Es gibt auch einige Beispiele, die mit Anführungszeichen wie set /a
usw. besser funktionieren. Wenn Sie jedoch mit Zeichenfolgen arbeiten, die Leerzeichen oder Sonderzeichen enthalten, ist die Verwendung von Anführungszeichen normalerweise ungefährlich.
Spaghetti-Code
Spaghetti-Code bedeutet ein Codeausschnitt, der viele und oft verwirrende Strukturen verwendet. Wie GOTO
, Ausnahmen und inkonsistenter Code.
Beispiele und Lösungen
Beispiel A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Dieses Programm hat viele Sprünge, wodurch es uns schwerer fällt, zu wissen, was genau das Skript macht.
Lösung A
@echo off
for /l %%G in (0,1,10) echo %%G
Mit weniger GOTO
haben wir die Menge an Code stark reduziert und können uns auf den eigentlichen Code konzentrieren.
Beispiel B
Beachten Sie die folgenden Aussagen.
: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
Dieser Ausschnitt erfordert viele goto
Anweisungen und kann beim Debuggen verwirrend sein. Um diese Anweisungen zu vereinfachen, können wir den call
. Hier ist das obige Skript in einem besseren Zustand.
: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
Beide Skripts geben exakt das gleiche Ergebnis aus, das neue Skript ist jedoch viel kürzer und übersichtlicher.