batch-file
Migliori pratiche
Ricerca…
introduzione
Questo argomento si concentrerà sulle cose che si dovrebbero (non obbligatorie) fare in un file batch. L'utilizzo di queste "migliori pratiche" può migliorare l'effetto e la funzione di un file batch.
Citazioni
La maggior parte degli script batch online ha molti problemi di quotazione.
Esempi e soluzioni
Esempio A
if %var%==abc echo Test
Questo codice funziona - quando il contenuto di %var%
non contiene spazio o altri caratteri speciali. Supponiamo che %var%
contenga 1 spazio bianco. Ora cmd.exe
vede:
if ==abc echo Test
Ciò causerebbe un errore perché cmd.exe
non capisce questa sintassi.
Soluzione A
if "%var%"=="abc" echo Test
Usando le virgolette, cmd.exe
vede l'intera %var%
(incluso spazio e caratteri speciali) come una sola stringa normale. Eppure questo non è il metodo di confronto più sicuro. Il più sicuro usa echo
, pipe
e findstr
.
Esempio B
cd C:\User\Spaced Name\Spaced FileName.txt
cd
cambierebbe solo la directory in C:\User\Spaced
, poiché cd
accetta solo un argomento di percorso.
Soluzione B
Semplicemente aggiungendo virgolette sul percorso, il problema sarebbe risolto.
cd "C:\User\Spaced Name\Spaced FileName.txt"
Ci sono anche alcuni esempi che funzionano meglio usando le virgolette, come il set /a
dichiarazione, ecc. Ma, quando si lavora su stringhe che contengono spazi o caratteri speciali, è di solito molto più sicuro usare le virgolette.
Codice degli spaghetti
Il codice Spaghetti indica un frammento di codice che utilizza molte e spesso confuse strutture. Come GOTO
, eccezioni e codice incoerente.
Esempi e soluzioni
Esempio A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
if %counter% equ 10 goto :exit
goto :Loop
:exit
Questo programma viene fornito con un sacco di salti, ci rende più difficile sapere cosa sta facendo esattamente lo script.
Soluzione A
@echo off
for /l %%G in (0,1,10) echo %%G
Usando meno GOTO
, abbiamo ridotto notevolmente la quantità di codice e possiamo concentrarci sul codice reale.
Esempio B
Considera le seguenti dichiarazioni.
: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
Questo snippet richiede molte istruzioni goto
e può confondere il debug. Per semplificare queste affermazioni, possiamo usare il comando di call
. Ecco lo script sopra in una condizione migliore.
: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
Entrambi gli script generano lo stesso risultato, ma il nuovo script è molto più breve e chiaro.