Quando un’operazione su Windows si ripete ogni giorno, continuare a digitare gli stessi comandi è tempo perso e aumenta il rischio di errori. Per creare file batch affidabili bastano un editor di testo, una buona organizzazione dei percorsi e qualche controllo sui risultati. In questa guida mostro come scrivere, eseguire e pianificare script .bat o .cmd, con esempi utili per file, backup e database.
La procedura essenziale per automatizzare attività su Windows
- Editor semplice: usa Blocco note o Visual Studio Code e salva il file come .bat o .cmd.
- Percorsi tra virgolette: proteggono lo script quando nomi di cartelle e file contengono spazi.
- Controllo degli errori: verifica ERRORLEVEL prima di considerare conclusa un’operazione.
- Log delle attività: reindirizza l’output in un file per capire cosa è successo.
- Utilità per database: mysqldump, pg_dump e sqlcmd funzionano solo se installati e configurati correttamente.
Che cosa fa davvero un file batch
Un file batch è un normale file di testo che contiene una sequenza di istruzioni eseguite da cmd.exe, l’interprete dei comandi di Windows. Invece di lanciare manualmente cinque comandi, li raccolgo in uno script e li avvio con un doppio clic, da terminale o tramite un’attività pianificata.
L’estensione più conosciuta è .bat. Anche .cmd viene eseguita dal Prompt dei comandi ed è spesso una scelta più chiara per gli script destinati ai moderni sistemi Windows. Nella pratica, la differenza principale non è nella sintassi quotidiana, ma nella convenzione e nel contesto in cui il file viene utilizzato.
| Estensione | Uso tipico | Indicazione pratica |
|---|---|---|
| .bat | Script personali, strumenti legacy e procedure compatibili con vecchi ambienti | È immediata da riconoscere e funziona nella maggior parte dei casi |
| .cmd | Automazioni amministrative e script pensati per Windows NT e versioni successive | La preferisco nei nuovi progetti, soprattutto quando lo script entra in una procedura strutturata |
Un batch non è però un programma completo. Ha variabili, condizioni e cicli, ma una gestione degli errori e dei dati meno ricca rispetto a PowerShell o Python. Io lo scelgo per operazioni lineari e ripetitive; quando servono API, JSON, autenticazione complessa o trasformazioni articolate, passo a uno strumento più moderno.
Come scrivere e salvare il primo script
Per iniziare, apri Blocco note e inserisci alcune istruzioni semplici. Questo esempio mostra un messaggio, crea una cartella e salva la data di esecuzione in un registro:
@echo off
setlocal
set "CARTELLA=%~dp0dati"
if not exist "%CARTELLA%" mkdir "%CARTELLA%"
echo Script eseguito il %date% alle %time%
echo [%date% %time%] Avvio completato >> "%CARTELLA%\attivita.log"
pause
endlocal@echo off nasconde la ripetizione dei comandi e rende l’output più leggibile. La variabile %~dp0 indica la cartella in cui si trova lo script, una scelta che rende il file più portabile rispetto a un percorso scritto manualmente come “C:\Users\Nome\Desktop”.
Salva il documento scegliendo File > Salva con nome. Imposta “Tutti i file” come tipo, assegna un nome come gestione_dati.bat e controlla che Windows non aggiunga automaticamente l’estensione .txt. Se il file si chiama gestione_dati.bat.txt, il sistema lo tratterà ancora come un documento di testo.
Per eseguirlo puoi fare doppio clic, aprire il Prompt dei comandi nella cartella corretta oppure richiamarlo con il percorso completo. Durante i test mantengo pause, perché consente di leggere il risultato; negli script pianificati la rimuovo, altrimenti il processo resta in attesa di un tasto.
I comandi che rendono il batch più utile
La sintassi di base si impara velocemente, ma sono alcuni comandi di controllo a distinguere uno script fragile da uno utilizzabile ogni giorno. Questi sono quelli che uso più spesso:
| Comando | Funzione | Perché serve |
|---|---|---|
| set | Crea una variabile | Evita di ripetere percorsi e nomi in più righe |
| if | Verifica una condizione | Permette di fermarsi se manca una cartella o un file |
| for | Ripete un’azione su più elementi | È utile per elaborare file, righe o cartelle |
| call | Avvia un altro batch | Divide una procedura grande in moduli più facili da mantenere |
| exit /b | Chiude lo script restituendo un codice | Comunica a Windows se la procedura è riuscita |
Variabili e percorsi
Racchiudi sempre i percorsi tra virgolette quando possono contenere spazi. La forma set "NOME=valore" evita che spazi accidentali finiscano dentro la variabile:
@echo off
setlocal
set "ORIGINE=%USERPROFILE%\Documenti"
set "DESTINAZIONE=%~dp0archivio"
if not exist "%DESTINAZIONE%" mkdir "%DESTINAZIONE%"
robocopy "%ORIGINE%" "%DESTINAZIONE%" /E /R:2 /W:5
if errorlevel 8 (
echo Copia non riuscita
exit /b 1
)
echo Copia completata
endlocalRobocopy è adatto alle copie di cartelle perché gestisce sottocartelle e tentativi di ripetizione. Il suo codice di uscita richiede attenzione: valori inferiori a 8 possono indicare successo o semplici differenze, mentre da 8 in poi è prudente trattare il risultato come errore.
Condizioni, cicli e log
Con if exist controlli la presenza di un file; con if errorlevel 1 verifichi se l’ultimo comando ha restituito un errore. Per registrare anche i messaggi prodotti da un programma, usa >> file.log 2>&1, che aggiunge sia l’output normale sia quello degli errori allo stesso registro.
Il comando for consente, per esempio, di elaborare tutti i file CSV di una cartella:
@echo off
for %%F in ("%~dp0input\*.csv") do (
echo Elaboro %%~nxF
copy "%%~fF" "%~dp0elaborati\" >> "%~dp0elaborazione.log" 2>&1
)
echo Operazione terminataNel file batch si usano due simboli di percentuale, %%F. Se esegui lo stesso ciclo direttamente nel Prompt dei comandi, ne basta uno. È un dettaglio piccolo, ma genera uno degli errori più frequenti tra chi prova a copiare una riga dal terminale dentro uno script.
Automatizzare backup e operazioni sui database
In un ambiente di sviluppo o in una piccola infrastruttura aziendale, il batch può coordinare il backup dei file e l’esecuzione dei client database. Lo script non contiene il database engine: richiama invece strumenti già installati, come mysqldump per MySQL o MariaDB, pg_dump per PostgreSQL e sqlcmd per SQL Server.
Un esempio MySQL essenziale è il seguente:
@echo off
setlocal
set "BACKUP=%~dp0backup"
set "FILE=%BACKUP%\miodb_%date:~-4,4%%date:~3,2%%date:~0,2%.sql"
if not exist "%BACKUP%" mkdir "%BACKUP%"
mysqldump -h localhost -u appuser -p miodb > "%FILE%"
if errorlevel 1 (
echo Backup MySQL fallito
exit /b 1
)
echo Backup creato in "%FILE%"
endlocalL’opzione -p richiede la password senza inserirla direttamente nel file. Per un’attività eseguita di notte senza utente collegato, devi configurare un metodo sicuro supportato dal client, perché una password in chiaro nel batch può essere letta da chiunque abbia accesso al file.
Per PostgreSQL la logica è simile:
pg_dump -h localhost -U appuser -F c -f "%BACKUP%\miodb.backup" miodb
if errorlevel 1 exit /b 1Il formato -F c crea un archivio utilizzabile con gli strumenti di ripristino di PostgreSQL. Prima di automatizzare, verifico sempre tre condizioni: il comando è disponibile nel PATH, l’account ha i permessi necessari e il file prodotto può essere davvero ripristinato. Un backup mai testato è soltanto una supposizione.
Per SQL Server puoi richiamare sqlcmd con autenticazione integrata, se l’account Windows dispone dei privilegi:
sqlcmd -S localhost -E -Q "BACKUP DATABASE [MioDB] TO DISK = N'C:\Backup\MioDB.bak' WITH INIT"Questi esempi sono volutamente specifici. Non esiste un comando universale per tutti i database, e sostituire semplicemente il nome del programma senza conoscere motore, porta, credenziali e formato di backup porta spesso a script che sembrano funzionare ma non producono un salvataggio valido.
Pianificare l’esecuzione e diagnosticare gli errori
Quando lo script funziona manualmente, puoi automatizzarlo con Utilità di pianificazione. Crea una nuova attività, indica il file batch come programma da avviare, scegli una frequenza e specifica l’account con cui eseguirlo. Se il processo accede a cartelle di rete o a un database, l’account deve avere quei permessi anche quando nessuno è collegato.
Da terminale puoi usare schtasks per creare un’attività giornaliera, per esempio alle 23:00:
schtasks /Create /TN "Backup database" /TR "C:\Scripts\backup.bat" /SC DAILY /ST 23:00Per i primi test preferisco l’interfaccia grafica, perché rende visibili cronologia, condizioni di alimentazione e impostazioni dell’utente. Il comando è comodo quando devi distribuire la stessa configurazione su più computer, ma richiede maggiore attenzione alle virgolette e al percorso reale dello script.
Leggi anche: API informatiche - come funzionano e quale approccio scegliere
Gli errori da eliminare prima della messa in produzione
- Percorsi relativi: l’attività pianificata può partire da una cartella diversa. Usa %~dp0 o percorsi assoluti.
- Spazi nei nomi: senza virgolette, “C:\Program Files” viene interpretato come più argomenti.
- Permessi e privilegi: esegui come amministratore solo quando è indispensabile e solo con script verificati.
- Nessun controllo: dopo copia, esportazione o compressione, verifica ERRORLEVEL.
- Password nel codice: evita credenziali in chiaro e limita i permessi sul file e sulla cartella dei backup.
- Output invisibile: salva un log con data, ora, comando eseguito e risultato.
Durante il collaudo provo anche i casi negativi: cartella sorgente assente, disco pieno, database non raggiungibile e credenziali errate. È qui che un’automazione dimostra il suo valore, perché deve fallire in modo leggibile e non limitarsi a chiudere una finestra senza spiegazioni.
Un file batch piccolo può diventare una procedura solida
Io partirei sempre da una sola operazione, la eseguirei manualmente e aggiungerei un controllo alla volta. Dopo aver verificato il risultato, inserirei log, gestione degli errori e pianificazione. La semplicità è un vantaggio, purché non significhi ignorare permessi, percorsi e possibilità di ripristino.
Per attività complesse, PowerShell offre strutture migliori per oggetti, rete, JSON e gestione delle eccezioni. Per copie locali, avvio di programmi, esportazioni semplici e piccole routine di manutenzione, invece, uno script batch ben scritto resta una soluzione rapida, gratuita e sorprendentemente efficace.