batch
A proposito dei files batch.
Francesco Melis su smanettando, 28\01\2013, h. 18.30.

(omissis)
Il file batch è un file di testo, creabile con un qualunque editor di
files ascii come il blocco note.
La sua estensione deve essere rigorosamente .bat
In ambiente Windows si può anche dare l'estensione .cmd.
Al suo interno si possono riportare, uno per riga, dei comandi del
sistema operativo Ms-Dos o le sue estensioni ed aggiunte di Windows
rispetto al repertorio originale del Dos.
Un file batch si può assimilare ad un vero e proprio programma inteso
come insieme di istruzioni per lo svolgimento di un determinato compito.
Le istruzioni usabili non sono facenti parte di un linguaggio di
programmazione vero e proprio ma sono gli stessi comandi della shell
testuale di Windows. In altri termini sono i comandi che si possono
digitare dal prompt dei comandi di Windows.
Alcuni di questi comandi sono stati espressamente creati per essere
usati nei files batch in quanto se eseguiti direttamente dalla linea di
comando non avrebbero molto senso.
I files batch si creano per automatizzare l'esecuzione sequenziale di
lunghe sequenze di comandi che, se impartiti scrivendoli uno per uno dal
prompt del Dos, richiederebbero molto tempo. L'utilità risiede quindi
nella possibilità di lanciare un numero qualsiasi di volte il file batch
per eseguire in maniera automatica la sequenza di istruzioni presente al
suo interno.
Essi vengono spesso creati per agevolare i compiti alle persone poco
esperte dei comandi del sistema operativo in quanto con un semplice nome
mnemonico da digitare dal prompt dei comandi si può mandare in
esecuzione una lunga e complessa procedura eseguibile in completo
automatismo che sicuramente agevola le persone poco esperte.
Essendo i comandi usabili all'interno di un file batch gli stessi
comandi utilizzabili dal prompt dei comandi occorre subito distinguere
questi comandi in due categorie che ne condizionano l'uso stesso.
I comandi possono essere interni od esterni.
I comandi interni sono quelli facenti parte nativamente della shell
testuale di windows, (nella fattispecie il command.com o il CMD.EXE), e
si possono digitare direttamente senza aggiunte per essere eseguiti.
Esempi di comandi interni sono Dir, CD, Md, Rd, Copy, eccetera.
I comandi esterni sono quelli che risiedono su files con estensione .exe
o .com e quindi esterni all'interprete dei comandi e lanciabili
digitandone il nome dal prompt.
Tutti i comandi o files eseguibili .exe si possono quindi assimilare a
comandi esterni del sistema operativo. Esempi sono format, sys, find,
fdisk, eccetera.
La differenza fra i due tipi dipende dal fatto che i comandi interni
vengono eseguiti sempre senza che il sistema operativo debba essere
istruito per sapere dove si trovano questi comandi semplicemente
digitandone il nome in qualunque contesto di directory.
I comandi esterni vengono eseguiti solo se il sistema operativo è
istruito sulla loro localizzazione. Questo comporta che questi comandi
devono essere inclusi nella variabile di ambiente "Path" oppure devono
essere digitati dal prompt preceduti dal percorso di directory nella
quale essi si trovano.
Ad esempio se si vuole lanciare in programma-comando Change.exe che sul
mio computer si trova nella directory c:\tools devo scrivere al prompt
del dos la seguente stringa comprensiva di percorso di directory:
c:\tools\change.exe
Come qualsiasi altro programma, quindi, la sua progettazione può essere
fatta seguendo dei criteri di ordine, pulizia, metodo, eleganza,
manutenibilità, efficienza eccetera, oppure essere fatto con i piedi.
A parte, quindi, programmi batch molto semplici che possono essere
creati scrivendo direttamente le istruzioni sul file, per creare un
programma seguendo dei criteri razionali occorre scrivere su carta un
progetto di quello che si vuole fare e, seguendo quella che si chiama
"strategia top-down" si decompone il problema in sotto problemi, e poi
questi ancora in sottoproblemi più piccoli, fino ad arrivare ad una
completa specifica del programma nel linguaggio adottato.
Tutta questa documentazione di sviluppo va conservata per consentire a
se stessi, e ad altri membri del Team, in tempi successivi, di poterci
mettere le mani per fare la manutenzione del programma senza dover
impazzire a ricostruire da capo ogni volta tutto il suo meccanismo di
funzionamento.
Dal momento che le istruzioni utilizzabili, come detto, sono quelle che
si possono scrivere dal prompt dei comandi, se si desidera veramente
imparare a creare files batch occorre studiare i comandi del Dos. Lo
studio dei comandi del dos si può fare per mezzo del materiale che si
può prelevare da internet o dallo stesso prompt dei comandi scrivendo
cmd /? per avere qualche direttiva sull'uso dello stesso interprete dei
comandi, oppure scrivendo il nome del comando del quale si desidera
conoscere la sintassi seguito dall'opzione /? per avere l'help del
comando stesso.
La mia opinione comunque è quella di procurarsi un buon libro sul quale
studiare le cose. Un buon libro sul Dos (come quello che posseggo io, ma
che non si trova più in commercio), può arrivare ad avere anche 850
pagine o più in nero.
Come si può intuire, in una mail non si può dire tutto quello che si può
fare in un file batch, per cui mi limiterò ad esporre un file batch
molto semplice fatto da me per semplificarmi alcune operazioni.
Il programma si chiama estrai.bat e l'ho costruito a suo tempo con lo
scopo di estrarre i contenuti da un cd-rom, inteso come nomi dei files e
delle cartelle in esso contenuti comprensivi del percorso completo di
directory, e di riversarli su un file di testo. In questo file dovranno
comparire quindi i nomi dei files e cartelle completi del loro percorso
ma, al posto della lettera dell'unità a disco che caratterizza tutti i
percorsi completi, (D: per intendersi), dovrà comparire la data della
masterizzazione del Cd, così non farò fatica a ritrovare un determinato
file nel mio archivio di Cd e Dvd. Per spiegarmi meglio: quando io ho
bisogno di trovare il cd che contiene un determinato file io farò la
ricerca in questo file di testo del nome del file che sto cercando con
le funzioni di ricerca dei programmi di elaborazione di testo. Una volta
trovata la riga con il file desiderato, mi troverò che all'inizio della
riga stessa c'è la data di masterizzazione seguita dal percorso in quel
cd del file trovato. Dal momento che i miei Cd sono conservati in
maniera ordinata per ordine di tempo di masterizzazione non avrò alcuna
difficoltà a trovare il mio file nella collezione di Cd. Senza
un'organizzazione di questo tipo avrei molta difficoltà a reperire un
file in mezzo ai molti milioni di files che posseggo.
Nel seguente file batch ogni riga, o quasi, è commentata nel suo
funzionamento. Il commento si trova nella riga precedente il comando ed
è individuato dalle righe che cominciano con la parola REM che è proprio
il comando che si usa nei files batch per scrivere delle descrizioni
testuali relative al funzionamento del programma in quel punto.
Se l'istruzione è banale o c'è una sequenza di istruzioni identiche è
inutile che commenti.
Il programma richiede in input come parametri il nome dell'unità a disco
della quale si vogliono estrarre i contenuti, il nome del file che dovrà
accogliere la lista dei contenuti e la data di masterizzazione del disco.
Ripeto: occorre conoscere la sintassi dei comandi del Dos altrimenti è
difficile se non impossibile capire il funzionamento. Del resto potete
ben capire che in una mail non posso certo spiegare i comandi del Dos
comprensivi della moltitudine di opzioni di cui sono corredati.
Ovviamente se voi provaste a far girare questo programma vi segnalerebbe
errore dato che quasi sicuramente non avete il programma change che
viene richiamato come comando esterno ed il cui scopo è quello di
effettuare la sostituzione di stringhe in un file qualunque.

File batch di esempio estrai.bat

REM fa in modo che i nomi dei comandi stessi non compaiano a video
durante l'esecuzione. La chiocciola disabilità la visualizzazione anche
dello stesso comando echo off
@echo off

REM pulisce lo schermo e riporta il prompt in alto a sinistra
cls

REM manda a video dei messaggi che illustrano lo scopo e la funzione del
programma
echo Estrazione dei contenuti dal CD-ROM su un file in ordine alfabetico
echo con sostituzione della intestazione delle righe con la data del disco

REM lascia di seguito due righe bianche vuote a video per scopi di
eleganza estetica
echo.
echo.

REM illustra a video all'utilizzatore la sintassi d'uso del programma
echo SINTASSI: ESTRAI nome_unita' nome_del_file_senza_est. data_disco

REM lascia un'altra riga bianca
echo.

REM visualizza a video un esempio d'uso del programma, l'ipotesi che si
fa qui è che il cd corrisponda alla lettera e:
echo ESEMPIO: ESTRAI e: lista 2009_11_23

REM descrive la funzione dell'esempio
echo Estrae i contenuti dal disco e: nel file "lista.txt" e sostituisce
tutte le
echo intestazioni di riga con la stringa "2009_11_23"

REM si fa un controllo che l'utente non abbia omesso per sbaglio di
scrivere il nome dell'unità a disco. Ciò viene fatto testando che il
primo parametro (%1) non sia vuoto. Nel caso il parametro sia vuoto si
passa ad eseguire l'istruzione la cui etichetta è err1 dove viene
segnalato il tipo di problema riscontrato.
if %1$==$ goto err1

REM se viene superato il primo test si passa a controllare che sia
presente il parametro (%2) relativo al nome del file su cui riversare i
nomi estratti. Se il test non viene superato viene eseguita l'istruzione
etichettata err2 dove viene segnalato il tipo di problema.
if %2$==$ goto err2

REM si testa che il nome del file inserito non sia già presente nella
cartella corrente. In tal caso viene ripresa l'esecuzione
dall'istruzione con etichetta err2e con la segnalazione del problema.
if exist %2.txt goto err2e

REM si testa che sia stata inserita la data del disco. Se manca viene
eseguita l'istruzione con etichetta err3 e segnalato l'errore.
if %3$==$ goto err3

REM si testa che la data non sia già stata impiegata e si conserva la
data attuale per i successivi controlli.
if '%disco%'=='' set disco=no_disco
if '%disco%'=='%3' goto err3e
set disco=%3

echo.
echo.

REM si genera la lista dei nomi dei files del cd in ordine alfabetico
per nome, senza dimensione e data e la si direziona nel file dato in
input e imponendo l'estensione .txt
echo Estrazione dei nomi dei files dall'unita' CD-ROM %1 sul file %2.txt
dir %1\*.* /s /b /o:n  %2.txt

REM si lancia il programma change per la sostituzione del nome
dell'unità con la data di masterizzazione
echo Sostituzione della stringa "%1\" con la stringa %3
c:\dos\change\change.exe %2.txt /from %1\ /to "%3 "  nul

REM l'esecuzione è terminata e salta alla fine
goto finito

REM sezione dei messaggi di errore. Dopo le segnalazioni si salta alla fine.
:err1
echo.
echo Attenzione manca il parametro Nome_Unita'!
echo.
echo Sintassi: estrai Nome_Unita' nome_del_file_senza_est. data_disco
goto fine

:err2
echo.
echo Attenzione manca il parametro Nome_del_file_senza_estensione!
echo.
echo Sintassi: estrai Nome_Unita' nome_del_file_senza_est. data_disco
goto fine

:err2e
echo.
echo Attenzione il file %2.txt Š stato gi… creato. Cambiare nome del file...
echo.
goto fine

:err3
echo.
echo Attenzione manca il parametro data_disco!
echo.
echo Sintassi: estrai Nome_Unita' nome_del_file_senza_est. data_disco
goto fine

:err3e
echo.
echo Attenzione la data %3 Š stata gi… impiegata. Cambiare Data_Disco...
echo.
goto fine

:finito
echo.
echo.

REM messaggio di conferma di processo concluso senza errori
echo Fatto!
:fine

***
d.

 grazie per tutto il lavoro che hai dedicato alla mia domanda.
 Altro che "qualche elemento", io lo chiamerei un mattone, sorriso.
 Nel mio archivio ho trovato un manuale del 1993 sul DOS che non
 ho mai affrontato seriamente allora, ma forse è venuto il tempo
 di farlo adesso. Spero che non siano cambiato le fondamenta.
 Il tuo esempio è troppo complicato per me, non avresti qualcosa
 di più leggero da potere eventualmente anche provare? Solo se
 hai voglia e tempo, e naturalmente senza fretta.
r.
Un esempio un po' più semplice di file batch che ancora abbia un'utilità
pratica può essere estrapolato dallo stesso esempio che ho mandato nel
post precedente.
Quello riporta una certa sofisticatezza per la presenza del controllo di
coerenza dell'input per cui compaiono quelle istruzioni criptiche con
percentuali, dollari e simboli strani.
Riscrivo di seguito lo stesso file un po' più terra terra ma ancora
funzionante quantunque un po' più "fragile".
Puoi fare il copia incolla di tutto quello che segue a partire dalla
prima riga con la REM fino all'ultima riga che riporta :fine, in un
nuovo file di testo che dovrai salvare con il nome estrai.bat. Dopo
basta che inserisci un Cd con dei dati e scrivi al prompt del dos,
quando sei posizionata sulla cartella che contiene il file estrai.bat,
estrai D: listafiles che ti crea nella stessa cartella un file chiamato
listafiles.txt con l'elenco di tutti i files del cd comprensivi di
percorso completo. Il nome del file non deve avere spazi. Se inserisci
altri cd e ridai il comando con gli stessi parametri ti ritroverai con
un file contenente la lista di tutti i tuoi cd accodati l'uno all'altro.
Si è fatta l'ipotesi che il lettore cd sia identificato dalla lettera
D:, se così non fosse dovrai scrivere la lettera che sul tuo computer
corrisponde al lettore Cd e che puoi vedere con risorse del computer.

REM fa in modo che i nomi dei comandi stessi non compaiano a video
durante l'esecuzione. La chiocciola disabilità la visualizzazione anche
dello stesso comando echo off
@echo off

REM pulisce lo schermo e riporta il prompt in alto a sinistra
cls

REM manda a video dei messaggi che illustrano lo scopo e la funzione del
programma
echo Estrazione dei contenuti dal CD-ROM su un file in ordine alfabetico

REM lascia di seguito due righe bianche vuote a video per scopi di
eleganza estetica
echo.
echo.

REM illustra a video all'utilizzatore la sintassi d'uso del programma
echo SINTASSI: ESTRAI nome_unita' nome_del_file_senza_estensione

REM lascia un'altra riga bianca
echo.

REM visualizza a video un esempio d'uso del programma, l'ipotesi che si
fa qui è che il cd corrisponda alla lettera D:
echo ESEMPIO: ESTRAI D: lista

REM descrive la funzione dell'esempio
echo Estrae i contenuti dal disco D: nel file "lista.txt"

echo.
echo.

REM si genera la lista dei nomi dei files del cd in ordine alfabetico e
la si direziona nel file dato in input.
echo Estrazione dei nomi dei files dall'unita' CD-ROM %1 sul file %2.txt
dir %1\*.* /s /b /o:n  %2.txt

REM messaggio di conferma di processo concluso senza errori
echo Fatto!
:fine

***
Francesco Melis:
Mi rispondo da solo.
Osservando come è arrivato in lista il mio messaggio precedente con il
listato, mi sento in dovere di illustrare a Veronika ed a chi fosse
interessato che le righe contenenti all'inizio la parola REM sono dei
commenti. Questi commenti sono arrivati in lista spezzati da dei ritorni
a capo. Se si incolla il listato così come è arrivato in lista con le
righe di commento spezzate l'interprete dei comandi vi segnala un casino
che non finisce più. Occorre allora ricomporre i commenti tutto su una
riga oppure eliminarli del tutto. Però bisogna avere le idee chiare sul
fin dove si deve tagliare ed aggiustare etcetera etcetera...
Allora facciamo così: il file batch lo creo io e lo metto su dropbox a
beneficio di chi fosse interessato.
https://dl.dropbox.com/u/28369839/estrai.bat
Torna all'indice