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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow