Sottoprogrammi e programmazione procedurale in un file batch

Uno degli approcci più classici nello sviluppo software è quello che prende il nome di programmazione procedurale. In buon sostanza di tratta della pratica di suddividere il programma principale  in parti più piccole, note con il termine di sottoprogrammi (in inglese subroutine) ma anche procedure o funzioni a seconda dei diversi linguaggi di programmazione. Tutto ciò per facilitare la stesura e la manutenzione del programma stesso. Dopo questa introduzione sui sottoprogrammi dareste per scontato la loro disponibilità nei file batch. Ebbene, sbagliereste, in quanto tale possibilità non è contemplata nei file batch. Tuttavia, una possibilità di emulare tale comportamento è comunque possibile individuarla, innanzitutto nell’utilizzo del comando CALL che consente di richiamare un altro file batch. Supponiamo allora di avere un file batch di esempio che serve solo a produrre un messaggio a video:

 

@ECHO OFF

REM File saluta.bat

ECHO Salve a tutti

 

Chiameremo il file, come visibile nel commento precedente, saluta.bat.

Il nostro file principale non dovrà far altro che richiamare, con il comando CALL, il file che funge da sottoprogramma, così come mostrato di seguito.

 

@ECHO OFF

REM Sottoprogrammi

ECHO Io sono il file principale

CALL saluta.bat

ECHO Sono ancora il file principale

 

Banalmente, il risultato a video sarà il seguente:

 

Io sono il file principale

Salve a tutti

Sono ancora il file principale

 

Intuitivamente, si capisce come il relegare un dato comportamento in un file che funge da sottoprogramma consente di snellire e modularizzare il proprio codice in quanto sarà possibile registrare in un dato file batch un certo blocco di istruzioni da far ripetere anche più volte all’interno del nostro programma principale.

Tuttavia, oltre a quello mostrato, esiste un altro modo per inserire una sorta di sottoprogramma direttamente nel file batch. Tale approccio sfrutta il concetto di etichetta. Una etichetta (label in inglese) è una stringa di testo, da terminarsi con il simbolo dei due punti, che viene posizionata in una riga qualsiasi del file batch e che può così essere considerata un punto di salto per l’esecuzione del comando GOTO. Di seguito subito un esempio:

 

@ECHO OFF

:ritorno

CLS

TIME /T

GOTO ritorno

 

Nel  codice proposto, potete notare un’etichetta di nome ritorno subito dopo della quale viene invocato il comando CLS seguito da TIME che visualizza la data corrente del sistema e che grazie all’opzione /T non ne chiede l’impostazione. L’ultima istruzione è GOTO ritorno che forza l’esecuzione a riprendere proprio dal punto etichettato come ritorno creando quindi un loop (nome tecnico per indicare un ciclo), in questo caso infinito. Per interrompere l’esecuzione sarà necessario usare la combinazione di tasti CTRL+C. Una particolarità relativa alle etichette è che Il comando GOTO accetta l’etichetta speciale di destinazione :EOF, che trasferisce il controllo alla fine del file batch corrente. Ciò consente di uscire da uno script senza definire un’etichetta specifica. Credo sia inutile sottolineare che il precedente è un programma assolutamente stupido e realizzato al solo scopo di presentare un esempio di facile comprensione relativo al comando GOTO. Tuttavia, abbiamo ora uno strumento in più che ci consente di rendere i nostri script maggiormente interattivi. Per dimostrarlo supponiamo di voler realizzare una piccola utility (ovvero un programma di utilità) che consenta all’utente di selezionare un certo comando informativo sullo stato del sistema. Vi scrivo di seguito il codice che commentiamo subito dopo.

 

@ECHO OFF

:menu

CLS

ECHO ****************************************************

ECHO *            VERIFICA RETE

ECHO *

ECHO *  1. VISUALIZZA IMPOSTAZIONI DI RETE

ECHO *  2. TEST CONNESSIONE RETE LOCALE

ECHO *  3. TEST CONNESSIONE INTERNET

ECHO *

ECHO *  Q. Esce e torna al prompt dei comandi

ECHO ****************************************************

 

SET GW=192.168.1.1

SET /P scelta=SCEGLI:

 

IF %scelta%==1 GOTO ipconfig

IF %scelta%==2 GOTO gateway

IF %scelta%==3 GOTO internet

 

IF %scelta%==Q GOTO :EOF

IF %scelta%==q GOTO :EOF

 

:ipconfig

ECHO Rileviamo le configurazioni delle schede di rete

IPCONFIG /ALL

PAUSE

GOTO menu

 

:gateway

ECHO Eseguiamo un ping al default gateway

PING %GW%

PAUSE

GOTO menu

 

:internet

ECHO Test connessione Internet

PING 8.8.8.8

PAUSE

GOTO menu

 

La prima parte dello script è assolutamente banale. Con una serie di comandi ECHO mostriamo a video un menu con tre classiche possibilità per fare il cosiddetto troubleshooting, ovvero individuazione ed eliminazione di un problema, della nostra connessione di rete. Vi faccio tuttavia notare come abbia posto, in testa allo script, un’etichetta, :menu, che servirà come punto di richiamo per far visualizzare il menu alla fine di ogni comando. Successivamente, al fine di rendere più gestibile lo script, dichiariamo, la seguente variabile di ambiente:

 

SET GW=192.168.1.1

 

Tale variabile GW contiene uno dei classici default gateway. Con tale termine si indica l’indirizzo IP che viene utilizzato per uscire dalla nostra rete locale. Di norma esso è l’indirizzo del router ADSL della nostra connessione ad Internet. Nel caso in cui tale IP dovesse risultare diverso da quello impostato per la nostra specifica macchina sarà sufficiente modificarlo di conseguenza. L’istruzione successiva:

 

SET /P scelta=SCEGLI:

 

visualizza il messaggio “SCEGLI:” e memorizza la digitazione dell’utente in una variabile dal quasi scontato nome scelta. Tale variabile verrà testata con una serie di IF per individuare la selezione effettuata dall’utente. Ognuna di tali scelte termina nel codice con i comandi:

 

PAUSE

GOTO menu

 

che consentono appunto, dopo una pausa di visualizzazione, il ritorno ai comandi ECHO che ripropongo a video il menu con le scelte possibili. Per chi è abituato a smanettare con i comandi di rete, IPCONFIG e PING sono pane quotidiano. Nello specifico, IPCONFIG, che aveva già visto in precedenza, con l’opzione /ALL, visualizza in dettaglio tutte le informazioni sulla configurazione della macchina in uso. Il comando PING, invece, serve per capire se la nostra scheda di rete riesce a comunicare, in gergo tecnico pingare l’indirizzo IP che specifichiamo come argomento del comando in questione. Nel caso dell’etichetta :gateway “pinghiamo” il gateway di default. Se questo dovesse essere diverso da 192.168.1.1 lo potremmo scoprire proprio con il comando IPCONFIG e quindi modificheremmo la variabile di ambiente GW di conseguenza. Nel caso, invece, dell’etichetta :internet effettuiamo il ping  con l’IP 8.8.8.8. Tale IP corrisponde ad un server DNS di Google e quindi è sempre attivo su Internet. Ovviamente potremmo utilizzare un IP pubblico qualsiasi che sappiamo essere sempre in linea al fine di verificare la nostra connessione verso l’esterno. Per inciso, un server DNS è una macchina che consente la traduzione, nota come risoluzione, dall’indirizzo IP al nome di dominio del tipo www.exaple.com e viceversa.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

Lascia un commento