Vai al contenuto

MANUALE DOS – I FILE BATCH

I FILE BATCH



Un file batch in dos è un file testuale contenente una sequenza di comandi DOS. L’obbiettivo dei files batch è l’automatizzazione di operazioni ripetitive. Benché i file batch DOS siano piuttosto limitati, è possibile scrivere semplici script per automatizzare alcune operazioni frequenti. Ad esempio se dovete cambiare spesso directory da c:\ a d:\programmi\editor\articoli\1998, la cosa più semplice e` quella di scrivere un file batch così:

la prima riga @echo off serve solo per evitare di mostrare i comandi eseguiti, mentre il resto sono gli usuali comandi che dareste tramite tastiera. Chiamando questo file cambia.bat, basterà ora digitare sul prompt del DOS il comando cambia per cambiare directory, semplice no ? Quello che forse non sapete, é che c’é un metodo ancora più veloce per fare la stessa cosa:

subst e: d:\programmi\editor\articoli\1998

in questo modo il drive “e:” diventa sinonimo di “d:\programmi\editor\articoli\1998”, ed invece dell’interminabile CD, e` sufficiente un E:.
Questo trucco puo` essere utilizzato anche in altre occasioni, ad esempio a volte capita di volere avere una directory con un nome molto lungo (o piu` sottodirectory) nel PATH, ma sfortunatamente il DOS non permette di avere piu` di 79 caratteri, percio` basta usare il comando subst sui percorsi piu` lunghi.

Vediamo ora alcune istruzioni di base che ci consentiranno di costruire piccoli programmini:

LE VARIABILI E I PARAMETRI



Le variabili servono a registrare dei valori acquisiti durante l’esecuzione di un programma. L’inizializzazione di una variabile (assegnamento di un valore iniziale) avviene mediante il comando SET


@echo off
:: Inizializzazione
set NOME=Marco
:: Stampa del valore
ECHO Il mio nome e': %NOME%
ECHO Il mio nome e': %nome% (si noti che le variabili non sono CASE SENSITIVE)
:: Eliminazione della variabile
SET NOME=

Tutte le variabili definite sono visibili digitando sul prompt del DOS il comando SET . Il nome delle variabili non è case sensitive ovvero scrivere una variabile in maiuscolo e la stessa cosa di scriverlo in minuscolo. Esistono due opzioni del comando SET : /A  per assegnare ad una variabile un’espressione numerica


@ECHO OFF
SET /A X=10
SET /A Y=3
SET /A Z=X+Y
ECHO %X% + %Y% = %Z%
SET /A Z=X-Y
ECHO %X% - %Y% = %Z%
SET /A Z=X*Y
ECHO %X% x %Y% = %Z%
SET /A Z=X/Y
ECHO %X% DIV %Y% = %Z%
SET /A Z=%X%%%Y%
ECHO %X% MOD %Y% = %Z%
SET /A X+=1
ECHO INCREMENTO X = %X%
SET /A A=8,3
SET /A B=3,6
SET /A C=A+B
ECHO -----------------------------------------------
ECHO i comandi batch non gestiscono numeri decimali
ECHO -----------------------------------------------
ECHO %A% + %B% = %C%

Che produce il seguente output:

E:\Users\Administrator\Desktop>operatori
10 + 3 = 13
10 - 3 = 7
10 x 3 = 30
10 DIV 3 = 3
10 MOD 3 = 1
INCREMENTO X = 11
-----------------------------------------------
i comandi batch non gestiscono numeri decimali
-----------------------------------------------
8 + 3 = 13
E:\Users\Administrator\Desktop>

Senza l’opzione /A i dati vengono trattati come stringhe. Vediamo il seguente esempio:


@ECHO OFF
SET X=10
SET Y=3
SET Z=%X%+%Y%
ECHO %X% + %Y% = %Z%
SET Z=X+Y
ECHO %X% + %Y% = %Z%

la cui esecuzione produce:

E:\Users\Administrator\Desktop>No_SlashA
10 + 3 = 10+3
10 + 3 = X+Y
E:\Users\Administrator\Desktop>

L’altra opzione è /P che consente l’input da parte dell’utente: verrà trattata nel prossimo paragrafo. Utilizzando /? si ottiene un help esaustivo del comando SET.

Come si citava all’inizio un batch è un file testuale nel quale sono inseriti dei comandi dos. E’ possibile rendere tale sequenza di comandi parametrica ovvero accanto al nome del file (durante la sua digitazione sul prompt) posso inserire una serie di stringhe che rappresentano i parametri del comando che intendo eseguire. Ad esempio è possibile, mediante la parametrizzazione, costruire un batch Somma il quale digitando Somma 1 23 12 esegue la somma degli argomenti

E:\Users\Administrator\Desktop>Somma 1 23 12
La somma 1 + 23 + 12 = 36
E:\Users\Administrator\Desktop>

I parametri passati al comando sono leggibili nello script tramite le variabili predefinite %1 %2 … %9 (quindi sembra che non sia possibile passare più di 9 argomenti ma in realtà il problema è superabile!). A queste si aggiungono: %0 e %* che contengono rispettivamente il nome del file batch e l’elenco completo dei parametri. Analizziamo l’esempio sottostante:

@ECHO OFF
:: Visualizzo i parametri
ECHO Nome file batch : %0
ECHO Tutti i parametri : %*
ECHO primo parametro : %1
ECHO secondo parametro : %2
ECHO terzo parametro : %3
ECHO quarto parametro : %4
ECHO quinto parametro : %5
ECHO sesto parametro : %6
ECHO settimo parametro : %7
ECHO ottavo parametro : %8
ECHO nono parametro : %9
ECHO decimo parametro : %10 (Si noti che da errore)

la sua esecuzione produce:

E:\Users\Administrator\Desktop>Elenca A B C D E F G H I L M
Nome file batch : Elenca
Tutti i parametri : A B C D E F G H I L M
primo parametro : A
secondo parametro : B
terzo parametro : C
quarto parametro : D
quinto parametro : E
sesto parametro : F
settimo parametro : G
ottavo parametro : H
nono parametro : I
decimo parametro : A0 (Si noti che da errore)

Il superamento dei 9 parametri verrà analizzato in seguito.

INPUT ED OUTPUT


Per quanto riguarda l’output abbiamo visto che ECHO frase visualizza a video la frase passata come argomento. Il comando cls consente la pulizia del video. Inserendo come prima riga @ECHO OFF disabilitiamo la visualizzazione dei comandi batch inseriti nel file.

L’input può avvenire in diversi modi:

A) Come accennato il comando SET /P consente di acquisire dei valori da tastiera. L’opzione /P è attiva solo se sono installate le “COMMAND EXTENSION” (sono presenti da win2000). Per verificare se tali estensioni sono attive basta digitare sul prompt questo comando: ECHO %CMDEXTVERSION%. Se viene visualizzato il numero 2 allora sono attive.

@ECHO OFF
set INPUT=
set /P INPUT=Digita qualcosa:
echo Hai digitato: %INPUT%

la sequenza di queste istruzioni determina questo output:


E:\Users\Administrator\Desktop>Digita
Digita qualcosa: ciao
Hai digitato: ciao
E:\Users\Administrator\Desktop>

B) Altra modalità è utilizzare il comando choice (questo comando è presente in tutte le versioni di Windows tranne in windows XP!)

Il comando dos choice presenta (nelle versioni Windows 2003 Server/Windows 2008 Server/Windows Vista/Windows 7) la seguente sintassi:

E:\Users\Administrator\Desktop>choice /?

CHOICE [/C scelte] [/N] [/CS] [/T timeout /D scelta] [/M testo]

Descrizione:
Questa utilità consente all'utente di selezionare un elemento da un elenco
di scelte e restituisce l'indice della scelta selezionata.

Elenco parametri:
/C scelte Specifica l'elenco delle scelte da creare.
L'elenco predefinito è "YN".

/N Nasconde l'elenco delle scelte nel prompt.
Il messaggio prima che il prompt venga visualizzato
e le scelte sono ancora abilitate.

/CS Abilita le scelte con distinzione tra maiuscole
e minuscole da selezionare.
Per impostazione predefinita, l'utilità
non effettua alcuna distinzione tra maiuscole
e minuscole.

/T timeout Il numero di secondi di sospensione
prima che venga
effettuata una scelta predefinita. I valori
accettabili sono compresi tra 0 e 9999.
Se è stato specificato 0, non ci sarà
sospensione e verrà selezionata la
scelta predefinita.

/D scelta Specifica la scelta predefinita dopo nnnn secondi.
Il carattere deve essere compreso nell'insieme
di scelte specificate dall'opzione /C
e deve specificare nnnn con /T.

/M testo Specifica il messaggio da visualizzare prima
del prompt. Se non specificato, l'utilità
visualizzerà soltanto un prompt.

/? Visualizza questo messaggio della Guida
...

Nella versione windows 98 il comando dos choice (versione disponibile per il download su questo sito) presenta una differente sintassi:


C:\WINDOWS\Desktop>choice /?
Attende che l'utente scelga da un insieme di scelte.

CHOICE [/C[:]scelte] [/N] [/S] [/T[:]c,nn] [testo]

/C[:]scelte Specifica i tasti ammessi. I predefiniti sono SN.
/N Non visualizza le scelte e ? alla fine della stringa di prompt.
/S Distingue tra Maiuscole e minuscole per quanto riguarda
i tasti di scelta.
/T[:]c,nn Scelta predefinita di c dopo nn secondi.
testo Stringa del prompt da visualizzare.

ERRORLEVEL è impostato sull'ordine dei tasti che l'utente preme per le sue
scelte.

ATTENZIONE! Per svolgere le esercitazioni, qualora il vostro PC abbia installato Windows XP, è necessario scaricare il comando choice  (preso da windows 98) dal seguente link CHOICE_win98.zip

Il comando choice non gestisce tutti i caratteri ma solo i simboli alfabetici (a-z, A-Z), numerici (0-9) oppure i codice ascii compresi tra 128 e 254.
 

B.1) Vediamo un primo esempio che consente la lettura di un singolo carattere tra A, B e C.

compatibile con choice di Win Vista, 7, 2008Server, 2003Servercompatibile con choice di Win 98 sotto Windows XP
@ECHO OFF CHOICE /N /C:ABC /M "Digita la scelta (A, B, o C):" echo %errorlevel%@ECHO OFF CHOICE /N /C:ABC "Digita la scelta (A, B, o C):" echo %errorlevel%

L’opzione /C 
definisce i caratteri ammessi dal comando choice
 

 e restituisce nella variabile d’ambiente 
%ERRORLEVEL%
 la posizione, rispetto all’elenco definito con /C

, del carattere digitato. Con questo batch di esempio, digitando il carattere C, vedremo che la variabile %ERRORLEVEL%
 viene posta al valore 3

E:\Users\Administrator\Desktop>Digita
Digita la scelta (A, B, o C): C
3
E:\Users\Administrator\Desktop>

La variabile d’ambiente ERRORLEVEL può essere settata in linguaggio C tramite l’istruzione exit. Questo meccanismo consente al programmatore la restituzione di un valore numerico che rappresenta lo stato di uscita (ad esempio se l’esecuzione si è conclusa senza errori) di un programma. Generalmente a valori diversi da 0 si abbinano esecuzioni incomplete o che hanno generato un errore. Immaginiamo quindi di costruire in C++ il seguente programma 
Conta_Arg.cpp.


#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
int i;
cout << "Report dal C++ : Nr. argomenti: " << argc-1 << endl;
// for (i=1; i <argc ; printf("%2d) %s\n",i-1,argv[i++]));
exit(argc-1); // restituisco in ErrorLevel il nr di argomenti
}

Compiliamo ed eseguiamolo. Qui sotto un esempio di esecuzione. Si noti che  
Conta_Arg si limita a stampare il numero di argomenti passati sulla linea di comando

C:\arch_def_1\Scuola\SW-Usato\Prove>Conta_Arg
Report in C++ : Nr. argomenti: 0

C:\arch_def_1\Scuola\SW-Usato\Prove>Conta_Arg Ave Student
Report in C++ : Nr. argomenti: 2

Per verificare il collegamento tra il comando EXIT  ed ERRORLEVEL basta provare il seguente file batch: TESTEXIT.BAT


@ECHO OFF
ECHO ---ESECUZIONE 1 (Nessun argomento)
Conta_Arg
ECHO Valore ERRORLEVEL: %ERRORLEVEL%
ECHO ---ESECUZIONE 2 (Due argomenti)
Conta_Arg AVE STUDENT
ECHO Valore ERRORLEVEL: %ERRORLEVEL%

Analizzando la sua esecuzione notiamo che ERRORLEVEL 
assume il valore indicato come argomento nell’istruzione EXIT
  del nostro programma in C++.

C:\arch_def_1\Scuola\SW-Usato\Prove>TestExit
---ESECUZIONE 1 (Nessun argomento)
Report dal C++ : Nr. argomenti: 0
Valore ERRORLEVEL: 0
---ESECUZIONE 2 (Due argomenti)
Report dal C++ : Nr. argomenti: 2
Valore ERRORLEVEL: 2

C) E’ possibile crearsi un piccolo programmino di input utilizzando il codice assembler. Utilizzando la sequenza qui sotto costruiamo un file (ad esempio 
leggi.asm) sostituendo la sequenza 
<invio>
 con dei ritorni a capo effettivi

COMANDIOUTPUTCOMMENTI
A 100
MOV AH,08
INT 21
CMP AL,0
JNZ 010A
INT 21
MOV AH,4C
INT 21
<invio>
rcx
e
n LEGGI.COM
w
q
<invio>
100








CX 0000


Writing 000E bytes
Inizio ad inserire le istruzioni assembler all’indirizzo 100
Legge da tastiera il carattere senza visualizzarlo
Interrupt 21 – MS-DOS service
Confronto AL con zero
se inizia con zero leggo il secondo codice del carattere

Interrupt 21 – MS-DOS service
Chiude il processo restituendo il codice ASCII

Interrupt 21 – MS-DOS service  

Successivamente sul prompt del DOS digitiamo questo comando:

debug<leggi.asm

Adesso nella cartella corrente dovreste trovare un file leggi.com di 14 byte. Il programma appena creato può essere utilizzato in questo modo


@ECHO OFF
echo Digita un carattere:
leggi
echo Il codice ASCII del carattere digitato: %errorlevel%

come si nota il programma registra nella variabile %ERRORLEVEL% 
il codice ASCII del carattere digitato.

E:\Users\Administrator\Desktop>Digita
Digita un carattere: 2
Il codice ASCII del carattere digitato: 50
E:\Users\Administrator\Desktop>

questo metodo più complesso ha il vantaggio di poter utilizzare qualsiasi carattere come input.

IF ELSE – ISTRUZIONE DI SELEZIONE

Nei batch file esistono tre Condizioni di riferimento indicate in questi esempi:IF [NOT] ERRORLEVEL numero istruzione
IF [NOT] stringa1==stringa2 istruzione
IF [NOT] EXIST NomeFile istruzione
 

la condizione ERRORLEVEL numero risulta vera se il valore di ERRORLEVEL è uguale o maggiore di numero. Pertanto per verificare l’esatta uguaglianza di un valore, ad esempio 3 dovrei utilizzare questa formula: IF ERRORLEVEL 3 IF ERRORLEVEL 4. L’ordine con cui inserisco il controllo relativo alla variabile ERRORLEVEL deve quindi iniziare partendo dai valori più alti e poi in modo decrescente fino ai valori più bassi.

Se il sistema operativo ha attive le “COMMAND EXTENSION” è possibile utilizzare anche questa formulazione:IF [/i] stringa1 OPERATORE stringa2 istruzione 

dove l’OPERATORE di confronto è scelto tra una di queste possibilità

EQUuguale
NEQdiverso
LSSmeno di
LEQmeno o uguale di
GTRpiù grande di
GEQpiù grande o uguale

/i indica che il confronto non sarà case sensitive. Questo switch è applicabile anche alla forma stringa1==stringa2.

La sintassi estesa per l’IF è la seguente:

IF Condizione (

istruzioneIF

) ELSE (
istruzioneELSE

)

ecco uno script di esempio che consente di valutare se ciò che digito non è un numero oppure valutare si si tratta di un positivo, negativo o zero.

@ECHO OFF                                 
set STRINGA=
set /P STRINGA=Digita un numero:
SET /A NUMERO=%STRINGA%
if %NUMERO% EQU %STRINGA% (
if %NUMERO% LSS 0 (
ECHO %NUMERO% numero negativo
) else (
if %NUMERO% GTR 0 (
ECHO %NUMERO% VALORE POSITIVO
) else (
ECHO %NUMERO% ZERO
)
)
) else (
ECHO %STRINGA% NON E' UN NUMERO
)

esiste anche una forma compatta

IF Condizione (istruzioneIF) ELSE (istruzioneELSE)

ecco un esempio che legge qualcosa da tastiera e visualizza se ho scritto ciao o altro

@ECHO OFF
set INPUT=
set /P INPUT=Digita qualcosa:
if /I %INPUT% EQU CIAO (ECHO HAI SCRITTO CIAO) ELSE (ECHO NON HAI SCRITTO CIAO)

GOTO – ISTRUZIONE DI SALTO


L’ istruzione GOTO consente di saltare con l’esecuzione ad un altro punto dello script. La sintassi generica è la seguenteGOTO Etichetta…

:Etichetta

Questa istruzione è molto utilizzata per costruire delle procedure iterative
L’esempio successivo implementa un menu a tre voci

@ECHO OFF
:INIZIO
CLS
ECHO 1 - Menu uno
ECHO 2 - Menu due
ECHO 3 - Menu tre
ECHO 4 - Esci dal menu
CHOICE /N /C:1234 /M "Scelta: "

IF errorlevel 4 goto TERMINA
IF errorlevel 3 goto MNU3
IF errorlevel 2 goto MNU2

ECHO Eseguo il menu uno ...
GOTO FINE
:MNU3
ECHO Eseguo il menu tre ...
GOTO FINE
:MNU2
ECHO Eseguo il menu due ...
:FINE
ECHO.
PAUSE
GOTO INIZIO
:TERMINA

FOR – ISTRUZIONE ITERATIVA


La sintassi generica del comando for è la seguente
 FOR [/opzione] %%variabile IN (Insieme) DO (
IstruzioniFOR
)

L’Insieme può essere un elenco di valori statico come in questo esempio:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *