Newsgroup: it.comp.os.dos
Titolo: cosa sono sti %1 ecc...?

vorrei sapere cosa sti simboli (%1-%9) che ho notato nell'autoexec.bat.
Cosa significano?
grazie Riccardo Barbieri

sono variabili che vengono prese in input
esempio se c'e' un copy %1 %2 e tu scrivi
copy a.exe b.exe e' la stessa cosa :)
ciao
--
********************************************
Cristiano Mariani    
http://www.vertexfx.com

Cosa significano?
Sono variabili del DOS contenenti i vari parametri con i quali e'
stato chiamato il batch corrente e che tu passi come parametro al
programma che stai chiamando.
Supponiamo ad esempio che tu voglia avere un file .bat che ti
controlla l'integrita' di uno o piu' file .zip e che si fermi in caso
d'errore. Avresti quindi qualcosa come (i numeri all'inizio delle
righe sono da togliere e sono stati messi solo per avere dei punti di
riferimento nella spiegazione e per capire quali righe vengono mandate
a capo dal news reader) :
01 @echo off
02 set zip_test_err=NOFILE
03 if '%1'=='' goto end
04 set zip_test_err=ALL_OK
05 
06 :loop
07 if not exist %1.zip goto err1
08 pkunzip -t %1
09 if errorlevel 1 goto err2
10 goto prosegui
11
12 :err
13 set zip_test_err=ERROR
14 pause
15 :prosegui
16 shift
17 if '%1'=='' goto end
18 goto loop
19
20 :err1
21 echo Il file %1.zip non esiste
22 goto err
23
24 :err2
25 echo Il file %1.zip contiene un errore
26 goto err
27 
28 :end
29 echo.
30 echo.
31 echo Controllo terminato.
32 if %zip_test_err%==NOFILE echo Non e' stato controllato nessun
file.
33 if %zip_test_err%==ALL_OK echo Non sono stati trovati errori.
34 if %zip_test_err%==ERROR echo E' stato trovato uno o piu' errori
(file mancanti o corrotti).
35 set zip_test_err=
Spiegazione.
Il programma (che magari chiameremo CHKZIP.BAT) accetta da riga di
comando il nome di uno o piu' file .zip (senza l'estensione) e
controlla l'integrita' del file fermandosi in caso d'errore. Alla fine
dell'elaborazione mostra un messaggio che riassume il test e dice se
ci sono stati errori.
Le prime 5 righe sono l'inizializzazione del programma e, in
particolare :
- viene disabilitato il display dei comandi eseguiti (riga 01)
- viene creata (riga 02) una variabile zip_test_err dove si
memorizzera' se ci sono stati errori. Con questo comando il contenuto
della variabile sara' uguale a NOFILE (vedi controllo in riga 32) e
verra' cambiato piu' avanti in uno di questi due casi :
    - il programma e' stato chiamato con almeno un parametro (riga 04)
    - uno dei vari test ha trovato un errore e quindi e' stata
richiamata la routine d'errore (riga 14)
- viene controllato (riga 03) se il programma e' stato chiamato con
almeno un parametro guardando se la variabile %1 contiene qualcosa
(diversa da nulla). Se il file .bat viene richiamato scrivendo ad
esempio "CHKZIP pippo pluto paperino" avremo che %1 contiene pippo, %2
e' uguale a pluto, in %3 c'e' paperino e in %4 (e successivi) non c'e'
nulla. L'IF pertanto sara' falso e l'esecuzione del programma
proseguira' alla riga seguente. Se invece il programma viene
richiamato scrivendo solo CHKZIP senza nessun parametro allora %1 e
successivi saranno vuoti e quindi verra' eseguito il goto alla label
end (riga 28). Da notare che esiste anche %0 il quale contiene sempre
il nome del programma (in questo caso CHKZIP).
- la variabile zip_test_err viene settata (riga 04) uguale a ALL_OK
(si presuppone che tutti i file siano ok)
Alla riga 06 inizia il loop di controllo dei file :
- riga 06 label loop alla quale si arriva dalla riga 05 (la
precedente) o dalla riga 18
- riga 07 viene controllo se esiste il file specificato nel primo
parametro (nel ns. esempio pippo.zip). In caso d'errore si prosegue
alla riga 20.
- riga 08 viene richiamato il programma pkunzip con il parametro -t
(test) e passando come ulteriore parametro il nome del file che
vogliamo controllare.
- riga 09 viene controllato se pkunzip ha trovato qualche errore
guardando il contenuto della variabile errorlevel. Nel caso sia uguale
o maggiore a 1 si prosegue con la riga 24 (trovato errore)
- riga 10 si prosegue l'elaborazione andando alla label prosegui (riga
15) dove verra' poi fatto un shift (riga 16) etc... etc...
Alla riga 12 (label err) arriviamo dalle righe 22 e 26. Qui abbiamo i
vari comandi che sono comuni ai vari errori cioe' viene messa la
variabile zip_test_err uguale a ERROR (riga 13) e viene richiamato
(riga 14) il comando di pausa (pause) grazie al quale vediamo il
messaggio "Premere un tasto per continuare..."
Alla riga 15 (label prosegui) arriviamo dalla riga 10 (quando il file
e' ok) o dalla riga 14 (quando c'e' un errore) e andiamo poi ad
eseguire lo shift di riga 16. Lo shift serve a (come dice l'help del
DOS) modificare la posizione dei parametri. Il contenuto di %1 viene
perso e sostituito dal contenuto di %2 che a sua volta riceve il
valore memorizzato in %3 e cosi' via. Nel ns. esempio, durante il
primo ciclo del loop, le variabili avevano i seguenti valori :
%1=pippo, %2=pluto %3=paperino. Dopo il primo shift invece avremo :
%1=pluto %2=paperino. Alla riga 17 viene di nuovo controllato se %1 e'
uguale al nulla e, in caso affermativo, andiamo alla label di fine
(riga 28). Altrimenti (riga 18) proseguiamo rientrando nel loop.
Questo IF serve a controllare se sono stati elaborati tutti i
parametri precedentemente shiftati. Nel ns esempio dopo il primo shift
avremo %1=pluto, dopo il secondo %1=paperino, dopo il terzo %1=nulla e
quindi capiremo che siamo arrivati alla fine.
Alla riga 20 arriviamo quando il file non esiste (controllo effettuato
alla riga 7). Viene quindi visualizzato un messaggio d'errore (riga
21) e si prosegue (riga 22) poi con la routine comune degli errori
(riga 12) precedentemente descritta. Analogo lavoro viene fatto dalle
righe 24, 25 e 26
Dalla riga 28 in poi abbiamo i messaggi finali. Vengono visualizzate
due righe vuote (righe 29 e 30) seguite dal messaggio "Controllo
terminato" (riga 31). Ci sono poi tre IF (righe 32, 33 e 34) che, in
base al contenuto della variabile zip_test_err visualizzano tre
messaggi diversi. Alla riga 35 la variabile zip_test_err viene
cancellata cosi' non occupa piu' spazio in memoria.
Se qualcosa non e' chiaro e/o esatto scrivimi pure (volendo anche in
e-mail)
ciao

 programma che stai chiamando.
Complimenti per la tua spiegazione, chiara ed esauriente. Allora perche' non
completarla parlando della direttiva SHIFT?
Il problema e' il seguente: ora che sappiamo gestire 9 parametri (10 in
realta' perche' c'e' pure il %0) di input nelle variabili %1...%9, come
facciamo se i parametri devono essere 10 o maggiori?
La risposta e' SHIFT. Quando viene eseguito "shifta" l'ordine dei parametri
verso il basso in maniera tale che quello che era %2 ora lo troviamo in %1 e
cosi' via; quindi i nostri parametri aggiuntivi che stanno dopo il %9
"entrano" uno alla volta dall'alto con le molteplici operazioni di Shift
applicate.
Bye, Sonic.

come facciamo se i parametri devono essere 10 o maggiori?
Questo mi ero dimenticato di dirlo.
ciao