====== Dos Batch : Appunti ======
===== Variabili d'ambiente Interessanti =====
^ Variabile ^ Descrizione ^ Esempio ^
| %date% | Restituisce la data di sistema | 07/05/2013 |
| %time% | Restituisce l'ora di sistema | 14.42.35,14|
===== Manipolazione delle variabili d'ambiente =====
Manipolazione della variabile ''%date%'' per trasformarla dal formato //dd/mm/yyyy// al formato //yyyymmdd//
SET mydate=%date:~6,4%%date:~3,2%%date:~0,2%
===== Esecuzione Condizionale (IF) =====
== Sintassi File ==
''IF [NOT] EXIST //filename command //''
''IF [NOT] EXIST //filename// (//command//) ELSE (//command//)''
== Sintassi Stringhe ==
''IF [/I] [NOT] **item1**==**item2** //command//''
''IF [/I] **item1** //compare-op// **item2** //command//''
''IF [/I] **item1** //compare-op// **item2** (//command//) ELSE (//command//)''
== Sintassi Controllo Errori ==
''IF [NOT] DEFINED //variable command//''
''IF [NOT] ERRORLEVEL //number command//''
''IF CMDEXTVERSION //number command//''
== Key ==
;item : Può essere una stringa di testo o di una variabile di ambiente \\ una variabile può essere modificata utilizzando sia \\ la sintassi stringa che la sintassi di ricerca
;command : Il comando da eseguire
;NOT : eseguire il comando se la condizione è false.
; == : eseguire il comando se le due stringhe sono uguali.
;/I : Esegue un confronto fra stringhe in modalità Case Insensitive.
;compare-op : Può essere una delle:
* EQU : Uguale
* NEQ : Diverso
* LSS : Minore di (<)
* LEQ : Minore o Uguale ( < = )
* GTR : Maggiore di (>)
* GEQ : Maggiore o Uguale ( >= )
Questa sintassi a 3 cifre è necessaria perché i simboli > e < sono riconosciuti come operatori di reindirizzamento
''IF ERRORLEVEL'' //n// statements devono essere letto come ''IF //Errorlevel// >= //number//'' \\
Esemio:
''IF ERRORLEVEL 0'' ritorna ''TRUE'' quando //errorlevel// è 64
Spesso anzichè interrogare la variabile ''ERRORLEVEL'' è preferibile utilizzare la sua versione stringa ''%ERRORLEVEL%'':
IF %ERRORLEVEL% GTR 0 Echo An error was found
IF %ERRORLEVEL% LSS 0 Echo An error was found
IF %ERRORLEVEL% EQU 0 Echo No error found
IF %ERRORLEVEL% EQU 0 (Echo No error found) ELSE (Echo An error was found)
IF %ERRORLEVEL% EQU 0 Echo No error found || Echo An error was found
L'ultimo caso può essere usato solo su piattaforme NT Style
Alcuni errori possono avere numeri negativi.
Quando si lavora con errorlevels in un file batch, è una buona idea utilizzare anche SETLOCAL in modo che la variabile %ERRORLEVEL% viene resettata ogni volta che il file batch viene eseguito.
''IF EXIST'' //filename// restituisce ''true'' se il file esiste (non è case sensitive).
== Esempi ==
IF EXIST C:\install.log (echo complete) ELSE (echo failed)
IF DEFINED _department ECHO Got the department variable
IF DEFINED _commission SET /A _salary=%_salary% + %_commission%
IF CMDEXTVERSION 1 GOTO start_process
IF %ERRORLEVEL% EQU 2 goto sub_problem2
== %1 esiste? ==
Per verificare l'esistenza di un parametro della riga di comando utilizzare le parentesi vuote come riportato di seguito
IF [%1]==[] ECHO Value Missing
oppure
IF [%1] EQU [] ECHO Value Missing
In the case of a variable that may be NULL - a null variable will remove the variable definition altogether, so testing for NULLs becomes easy:
Assegnando ''NULL'' ad una variabile, la sua definizione viene eliminata. In questo modo testare se una variabile è ''NULL'' diventa facile:
IF NOT DEFINED _example ECHO Value Missing
''IF DEFINED'' restituirà ''True'' se la variabile contiene qualsiasi valore (anche se il valore è solo uno spazio)
== Verificare l'esistenza di file e cartelle ==
''IF EXIST //name//'' - Rileva l'esistenza di un file o di una cartella.
== Parentesi ==
Le parentesi possono essere usate per dividere i comandi su più righe. Ciò consente la scrittura di istruzioni ''if ... else ...'' più complesse:
IF EXIST filename.txt (
Echo deleting filename.txt
Del filename.txt
) ELSE (
Echo The file was not found.
)
Quando si utilizzano le parentesi, la shell CMD espande [legge] tutte le variabili all'inizio del blocco di codice e utilizza tali valori anche se il contenuto delle variabili è appena stato cambiato. \\
Attivare ''[[http://ss64.com/nt/delayedexpansion.html|DelayedExpansion]]'' costringerà la shell a leggere le variabili all'inizio di ogni riga.
== Delimitatori ==
If the string being compared by an IF command includes delimiters such as [Space] or [Comma], then either the delimiters must be escaped with a caret ^ or the whole string must be "quoted".
This is so that the IF statement will treat the string as a single item and not as several separate strings.
Se la stringa da confrontare comprende delimitatori come [Spazio] o [virgola], per entrambi i delimitatori devono essere usate le sequenze di escape (carattere ^) o l'intera stringa deve essere "citata".
In questo modo l'istruzione ''IF'' tratterà la stringa come un singolo elemento e non come più stringhe separate.
== Verificare valori numerici ==
''IF'' analizza solo i numeri quando si utilizza uno dei seguenti operatori di confronto: ''EQU'', ''NEQ'', ''LSS'', ''LEQ'', ''GTR'', ''GEQ''.
L'operatore di confronto ''=='' si traduce sempre in un confronto di stringhe.
This is an important difference because if you compare numbers as strings it can lead to unexpected results: "2" will be greater than "19" and "026" will be greater than "26".
Questa è una differenza importante, perché se si confrontano i numeri come stringhe si possono ottenere risultati imprevisti: \\
"2" sarà maggiore di "19" e "026" sarà maggiore di "26".
Corretto confronto numerico:
IF 2 GEQ 15 echo "bigger"
Utilizzando parentesi o citazioni forzerà il confronto fra stringhe:
IF (2) GEQ (15) echo "bigger"
IF "2" GEQ "15" echo "bigger"
This behaviour is exactly opposite to the SET /a command where quotes are required.
Questo comportamento è esattamente opposto a quello di ''SET / //comando//'' in cui sono richieste le virgolette.
== Caratteri Jolly (Wildcards) ==
I caratteri jolly non sono supportati da ''IF'', quindi ''%COMPUTERNAME% == //SS6*//'' non corrisponderà a //SS64//
Una soluzione è quella di recuperare la sotto-stringa e confrontare solo quei caratteri:
SET _prefix=%COMPUTERNAME:~0,3%
IF %_prefix%==SS6 GOTO they_matched
== Concatenamento Comandi (Pipes) ==
Quando si concatenano comandi, l'espressione viene valutata da sinistra a destra, in questo modo: \\
''IF... | ...'' è equivalente a ''(IF ... ) | ...'' \\
è anche possibile utilizzare la sintassi esplicita ''IF (... | ...)''
== ERRORLEVEL ==
Per generare deliberatamente un errore e la conseguente valorizzazione di ''ERRORLEVEL'' in uno script batch usare il comando ''[[http://ss64.com/nt/exit.html|EXIT /B]]''.
E' possibile (anche se non è una buona idea) creare una variabile stringa chiamata ''%ERRORLEVEL%'' (variabile utente)
Se presente una tale variabile impedirà al vero ERRORLEVEL (una variabile di sistema) di essere utilizzato da comandi come ''ECHO'' e ''IF''.
Per verificare l'esistenza di una variabile utente con tale nome, usare ''SET ERRORLEVEL'', o ''IF DEFINED ERRORLEVEL''
Se le [[http://ss64.com/nt/cmd.html | Command Extensions]] sono disattivate ''IF'' supporterà solo i confronti diretti: \\
''IF =='' , ''IF EXIST'', ''IF ERRORLEVEL'' ed anche la variabile di sistema ''CMDEXTVERSION'' verrà disabilitata.
''IF'' è un comando interno.
===== Acquisizione Input Utente =====
In alcuni batch è richiesto che l'utente inserisca dati, per evitare di dover ricorrere a programmi esterni esiste la sintassi seguente:
set /p nome_var= prompt di richiesta
ecco un esempio di utilizzo:
:START
cls
@echo off
echo.
echo Remote Desktop Client - shutdown or restart
echo.
echo When you use Remote Desktop you do not have
echo the usual restart/shutdown choices.
echo This will RESTART or SHUTDOWN the remote client
echo according to your choice.
echo.
echo 1. Restart
echo 2. Shutdown
echo 3. Abort
echo.
set /p userinp= Choose a number(1-3):
set userinp=%userinp:~0,1%
if "%userinp%"=="1" goto restart
if "%userinp%"=="2" goto shutdown
if "%userinp%"=="3" goto end
echo invalid choice
goto start
:restart
Echo Program: Please wait....
shutdown -r -t 01
goto end
:shutdown
shutdown -s -t 01
goto end
:end
===== XCOPY Exit Code =====
^ Exit code ^ Description ^
| 0 | Files were copied without error. |
| 1 | No files were found to copy. |
| 2 | The user pressed CTRL+C to terminate xcopy. |
| 4 | Initialization error occurred. There is not \\ enough memory or disk space, or you entered \\ an invalid drive name or invalid syntax on \\ the command line. |
| 5 | Disk write error occurred. |
===== Fonti =====
^Links^
|[[http://www.mandrilo.com/index.php/mini-how-to-archive/149-windows-dos-batch-programming-error-handling]]|
|[[http://ss64.com/nt/if.html]]|
|[[http://stackoverflow.com/questions/8219040/windows-copy-command-return-codes]]|