File list in file di testo

con spiegazione (EN Version)

Sabato mattina. Il cielo è nero, pesante, dello stesso colore del mio umore quando non posso mettere mano ai lavori fuori casa. E piove. Odiosa pioggia. Quando piove succede sempre qualcosa: un tombino decide di intasarsi, un pozzo sale più del dovuto, una grondaia perde proprio nel punto più scomodo. E io, che ho solo il sabato per i “lavoretti extra” – perché la domenica sono rigorosamente family man – mi ritrovo a girare per casa come un’ape nervosa, a guardare fuori dalla finestra sperando che smetta, o a sporgere la testa dalla porta per capire se si può uscire “anche con poca pioggia”. A un certo punto, rassegnato, battezzo la giornata: “Giornata delle cose fastidiose da fare al lavoro.” E così, tra una cosa e l’altra, riapro un task vecchio. Ma vecchio davvero. Uno di quelli che giace in un angolo da mesi, così noioso che perfino a rileggerlo sembra sbuffare e lamentarsi.

Qualche tempo fa una query – offesa per motivi che non sto qui a spiegare – aveva deciso di produrre centinaia di file invece che decine. E si era permessa di farlo per tre giorni di fila. Sistemare si può, anzi si deve, ma questo significava confrontare log e file sparsi in cartelle piene zeppe di roba. Un lavoro da ore, forse giorni. E qui entra in gioco il mio metodo: quando mi trovo davanti a un compito lungo e ripetitivo, investo il 20% del tempo per capire come far fare all’amico computer l’80% del lavoro. È un patto che abbiamo da anni: io penso, lui macina.

Di solito parto dalla fine: mi scrivo una frase che descrive l’obiettivo finale. Poi scompongo il lavoro in macro‑passi, e andando a ritroso costruisco il piano d’azione. Un piccolo rituale. E come ogni rituale che si rispetti, la prima cosa che faccio è aprire la mia LDU. La Little Devil’s Utility: una cartella che contiene trent’anni di batch, Excel, formule, micro‑applicazioni e altre diavolerie. Un arsenale di strumenti nati per risolvere problemi, spesso creati in giornate come questa. Una volta aveva anche un’icona personalizzata, un piccolo diavoletto rosso… poi un giorno il file si è corrotto e addio mascotte. La mia cartella delle piccole magie dimenticate mi offre di tutto eccetto, ovviamente, quello che mi serve. Quindi armiamoci di fantasia, un paio di vecchi libri e qualche cioccolatino per “la danza del test riuscito”.

ora, tu che leggi potresti pensare:

“Ma scusa, non basta fare dir > list.txt?”

Sì, certo. Nulla di più facile. Ma prova a farlo per 300 cartelle, ognuna con centinaia di file. La ripetitività ti divora l’anima. E allora… perché non divertirsi un po’? Perché non lasciare che sia un vecchio amico – il file batch – a fare il lavoro sporco?

Il mio task iniziava proprio così: listare il contenuto delle directory. E già che c’ero, mi sono concesso il gusto di farlo bene, con uno script DOS semplice ma elegante. Automatizzare piccole attività quotidiane è uno dei modi più efficaci per risparmiare tempo e ridurre gli errori, e questo è uno di quei casi in cui un pizzico di automazione ti salva la giornata e rimette apposto l’umore.

In questo articolo ti racconto lo script che ho realizzato e, soprattutto, perché ogni istruzione è lì. Non solo quattro righe buttate giù, ma un piccolo viaggio dentro la logica di un batch fatto come si deve.

Lo script completo

Analisi riga per riga

1. @echo off

Disattiva la visualizzazione dei comandi mentre vengono eseguiti. Serve a rendere l’output più pulito e leggibile, mostrando solo ciò che vogliamo comunicare all’utente. Quando uno script batch gira, per impostazione predefinita mostra ogni comando prima di eseguirlo. Questo crea molto “rumore” visivo.

di seguito @echo off, dice al prompt: “Esegui i comandi, ma non mostrarli a schermo.”

La chiocciola @ serve a nascondere anche quella stessa riga, così lo script parte pulito.

Fa l’opposto: riattiva la visualizzazione dei comandi. È utile quando vuoi fare debug o capire cosa sta succedendo dentro lo script.

Esempio:

Da quel punto in poi, ogni comando verrà mostrato prima di essere eseguito.

È un commento. Serve a scrivere note, spiegazioni o promemoria dentro lo script. Il comando non viene eseguito e non influisce sul funzionamento.

Esempio:

Puoi usare anche :: come alternativa più veloce, ma “rem” è più leggibile e compatibile.

2. setlocal enabledelayedexpansion

Attiva la delayed expansion, necessaria quando si usano variabili che cambiano dentro un ciclo (for). Senza questa opzione, variabili come !NAME! o !OUTFILE! non verrebbero aggiornate correttamente.

3. set DIRLIST="mia_dir..." "mia_dir/dir2..."

Qui definiamo l’elenco delle cartelle da analizzare. La cosa importante è che:
– le path sono racchiuse tra virgolette (per gestire eventuali spazi)
– sono nella stessa variabile, quindi separate da uno spazio
Questo permette al ciclo for di iterare su ciascuna cartella in modo indipendente.

4. echo Generazione report...

Una semplice comunicazione all’utente: lo script sta iniziando il lavoro.

5. Il ciclo for

Il cuore dello script. Per ogni directory contenuta in DIRLIST, la variabile %%D assume il valore della path corrente.

6. echo Analizzo %%D...

Messaggio informativo: utile per capire quale cartella è in elaborazione.

7. set "NAME=%%~nD"

Estrae solo il nome della cartella, senza percorso. Esempio:

  • c:\mia_dir\SCAN3492SCAN3492
  • c:\mia_dir\SCAN3492\TransferTransfer

Questo nome verrà usato per generare il nome del file di output.

8. set "OUTFILE=%%D\Filelist_!NAME!.txt"

Qui costruiamo il percorso completo del file di testo da generare.

Esempio:

c:\mia_dir\SCAN3492\Filelist_SCAN3492.txt
c:\mia_dir\SCAN3492\Transfer\Filelist_Transfer.txt

per cui, ogni cartella contiene il proprio report, non serve una cartella centralizzata, il file è sempre vicino ai dati che descrive.

9. Il comando "dir"

dir "%%D" /a:-d /t:w > "!OUTFILE!"

Qui si concretizza il comando:

  • "%%D" → la cartella da analizzare
  • /a:-d → mostra solo i file, escludendo le directory
  • /t:w → ordina per data di ultima modifica
  • > → reindirizza l’output nel file di testo

Nota importante: non c’è /s, quindi lo script NON scende nelle sottocartelle perché originariamente questo è esattamente ciò che volevo, solo i file nella root.

10. echo Fatto.

Messaggio finale di conferma.

11. pause

Mantiene aperta la finestra del prompt finché l’utente non preme un tasto. Utile quando si esegue lo script con doppio clic anziché entrando nella consolle del prompt.

In estrema sintesi, tutto ciò che inserisco come path dentro DIRLIST, racchiuso tra virgolette, viene elencato in un file nomecartella.txt. Poche righe di batch, e il problema è risolto in modo elegante. Per semplificarmi la vita ho prima estratto l’elenco delle cartelle da analizzare, così da poterle “bonificare” rapidamente: aggiungere le virgolette, sistemare i percorsi, e incollarle pronte nel mio script. Una volta unite le path al file batch, il lavoro è durato meno di un minuto. Il passo successivo – e anche quello più curioso – è stato ricostruire un log giornaliero partendo da uno spezzettamento inspiegabile di decine di micro‑log. Anche lì ho trovato un metodo semiautomatico e sicuro per unire tutto, ma la lettura finale era inevitabile: i log vanno controllati, perché basta una riga troncata per perdere un’informazione importante. Quella parte è stata meno divertente, certo. Ma sempre meglio che stare sotto la pioggia.

Grazie del tuo tempo

L.C.

Lascia un commento

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