batch-file
Bästa metoder
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.