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.batTorna all'indice