Sök…


Introduktion

Detta ämne kommer att fokusera på de saker som man bör (inte obligatoriskt) göra i en batchfil. Att använda dessa "bästa metoder" kan förbättra effekten och funktionen för en batchfil.

Citat

De flesta batchskript online har många offertfrågor.


Exempel och lösningar

Exempel A

if %var%==abc echo Test

Den här koden fungerar - när innehållet i %var% inte innehåller utrymme eller andra specialtecken. Låt oss nu anta att %var% innehåller 1 vitrymd. Nu ser cmd.exe :

if  ==abc echo Test

Detta skulle orsaka ett fel eftersom cmd.exe inte förstår denna syntax.

Lösning A

if "%var%"=="abc" echo Test

Med citat ser cmd.exe hela %var% (inklusive utrymme och specialtecken) som bara en vanlig sträng. Ändå är detta inte den säkraste jämförelsemetoden. Det säkraste använder echo , pipe och findstr .


Exempel B

cd C:\User\Spaced Name\Spaced FileName.txt

cd skulle bara ändra katalog till C:\User\Spaced , eftersom cd bara accepterar ett sökvägsargument.

Lösning B

Helt enkelt genom att lägga till citat runt vägen skulle problemet lösas.

cd "C:\User\Spaced Name\Spaced FileName.txt"

Det finns också några exempel som fungerar bättre med citat, som set /a uttalande, etc. Men när man arbetar på strängar som innehåller mellanslag eller specialtecken är det vanligtvis mycket säkert att använda citat.

Spaghettikod

Spaghettikod betyder ett kodavsnitt som använder många och ofta förvirrande strukturer. Såsom GOTO er, undantag och inkonsekvent kod.


Exempel och lösningar

Exempel A

@echo off
set /a counter=0

:Loop
set /a counter=%counter% + 1
echo %counter%

if %counter% equ 10 goto :exit
goto :Loop

:exit

Detta program kommer med många hopp, vilket gör oss svårare att veta exakt vad manuset gör.

Lösning A

@echo off
for /l %%G in (0,1,10) echo %%G

Med mindre GOTO er minskade vi mängden kod kraftigt och vi kan fokusera på den faktiska koden.


Exempel B

Tänk på följande uttalanden.

: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

Det här utdraget kräver många goto uttalanden och kan vara förvirrande att felsöka. För att förenkla dessa uttalanden kan vi använda call . Här är skriptet ovan i bättre skick.

: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

Båda skripten ger exakt samma resultat, men det nya skriptet är mycket kortare och tydligare.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow