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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow