batch-file
Best practices
Zoeken…
Invoering
Dit onderwerp richt zich op de dingen die men moet doen (niet verplicht) in een batchbestand. Het gebruik van deze 'best practices' kan het effect en de functie van een batchbestand verbeteren.
Citaten
De meeste online batch-scripts worden geleverd met veel citaatproblemen.
Voorbeelden en oplossingen
Voorbeeld A
if %var%==abc echo Test
Deze code werkt - wanneer de inhoud van %var%
geen spatie of andere speciale tekens bevat. Laten we aannemen dat %var%
1 witruimte bevat. Nu ziet cmd.exe
:
if ==abc echo Test
Dit zou een fout veroorzaken omdat cmd.exe
deze syntaxis niet begrijpt.
Oplossing A
if "%var%"=="abc" echo Test
Met aanhalingstekens ziet cmd.exe
het gehele %var%
(inclusief spatie en speciale tekens) als slechts één normale tekenreeks. Toch is dit niet de veiligste vergelijkingsmethode. De veiligste gebruikt echo
, pipe
en findstr
.
Voorbeeld B.
cd C:\User\Spaced Name\Spaced FileName.txt
cd
zou alleen de map wijzigen in C:\User\Spaced
, omdat cd
slechts één C:\User\Spaced
accepteert.
Oplossing B
Door eenvoudigweg quotes aan het pad toe te voegen, zou het probleem zijn opgelost.
cd "C:\User\Spaced Name\Spaced FileName.txt"
Er zijn ook een paar voorbeelden die beter werken met aanhalingstekens, zoals de set /a
instructie, enz. Maar als je werkt op strings die spaties of speciale tekens bevatten, is het meestal veel veiliger om aanhalingstekens te gebruiken.
Spaghetti Code
Spaghetticode betekent een codefragment dat veel en vaak verwarrende structuren gebruikt. Zoals GOTO
's, uitzonderingen en inconsistente code.
Voorbeelden en oplossingen
Voorbeeld A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Dit programma bevat veel sprongen, waardoor we moeilijker weten wat het script precies doet.
Oplossing A
@echo off
for /l %%G in (0,1,10) echo %%G
Door minder GOTO
's te gebruiken, hebben we de hoeveelheid code aanzienlijk verminderd en kunnen we ons concentreren op de werkelijke code.
Voorbeeld B.
Overweeg de volgende verklaringen.
: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
Dit fragment vergt veel goto
statements en kan verwarrend zijn om te debuggen. Om deze verklaringen te vereenvoudigen, kunnen call
opdracht call
gebruiken. Hier is het bovenstaande script in een betere staat.
: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 scripts geven exact hetzelfde resultaat, maar het nieuwe script is veel korter en duidelijker.