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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow