Programmi, Program Files e Program Files (x86): un po’ di chiarezza

All’interno di Windows 10, la cartella C:\Program Files\ è visibile con questo nome solo accedendo tramite prompt dei comandi. Infatti, se proviamo a visualizzare la struttura di cartella tramite Esplora file, vedremo, al di sotto della radice, due cartelle simili che hanno a che fare con i programmi e la loro installazione: C:\Programmi e C:\Programmi (x86).

Il motivo di questa organizzazione è dato dal fatto che quello che vediamo tramite Esplora file è una localizzazione, ovvero la traduzione nella lingua del sistema operativo, ad esempio l’italiano, rispetto al nome reale delle cartelle.

In ogni caso, la cartella visibile come C:\Programmi corrisponde, come detto, alla cartella reale C:\Program Files. Tale cartella, nei sistemi a 64 bit, ormai la quasi totalità, contiene le installazioni degli applicativi, appunto a 64 bit. Invece, la cartella visibile come C:\Programmi (x86) corrisponde alla cartella reale C:\Program Files (x86) nella quale vengono installate le versioni a 32 bit dei vari programmi di cui si effettua il setup (installazione).

Le applicazioni scritte per l’ambiente a 64 bit vengono eseguite in maniera normale, tecnicamente di dice nativa, mentre quelle a 32 bit vengono emulate nell’ambito di un processo di nome WOW64 (Win32 On Win64).

Carlo A. Mazzone

 

Supportaci condividendo sui social il nostro articolo!

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!

Linux e Windows 10: la shell Bash

Oltre alla soluzione che prevede l’installazione di Cygwin  (https://www.cygwin.com/) come ambiente di emulazione per Linux, per i sistemi Windows 10 esiste un’alternativa che prevede l’installazione della shell bash come applicativo nativo di Windows stesso. La bash su Windows fornisce così agli sviluppatori e sistemisti una shell Linux in  cui eseguire la maggior parte dei comandi Linux senza dover installare uno specifico emulatore esterno. Il prerequisito fondamentale per l’installazione di tale bash è che il nostro Windows sia una versione a 64-bit Anniversary Update build 14393 o superiore. Per verificare la versione del sistema in uso è sufficiente e l’architettura  della CPU della nostra macchina è sufficiente accedere a Impostazioni->Sistema-> Informazioni su.

Inoltre è necessario impostare manualmente il sistema operativo in Modalità sviluppatore (in inglese, Developer Mode). Per farlo è necessario seguire la sequenza Impostazioni -> Aggiornamento e sicurezza -> Per sviluppatori e selezionare l’opzione Modalità sviluppatore. A questo punto non rimane altro che installare la bash accedendo alla funzionalità Attiva o disattiva funzionalità di Windows e selezionando, così come mostrato in figura, la voce sottosistema Windows per Linux.

Per lanciare e utilizzare l’ambiente Linux sarà ora sufficiente aprire una console CMD e digitare il comando bash.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

Batch backup: un piccolo script per grandi backup

E’ esigenza diffusa realizzare copie di sicurezza di file personali e/o aziendali su una macchina diversa da quella in cui risiedono i file stessi. In questo micro post vi riporto un semplice script da utilizzarsi su macchine windows verso uno sharing di rete che può essere ospitato tanto su di un server Windows tanto su di una macchina Linux con server Samba.

Si tratta di un file batch molto semplice ma efficace ed efficiente.

Per prima cosa si definiscono un paio di variabili di ambiente che facilitano l’eventuale modifica del file. La variabile LOGFILE contiene il percorso ed il nome di un file di LOG in cui memorizzare le attività svolte dallo script. Una seconda variabile di nome REMOTEDISK indica la lettera di unità di volume dello sharing per la destinazione del backup.

Al lancio lo script accoda nel file di log data ed ora dell’inizio delle operazioni e verifica l’esistenza della destinazione. In caso negativo termina saltando all’etichetta :notarget. Le istruzioni ECHO sembrano ripetitive ma hanno uno scopo. La prima è per la visualizzazione a schermo durante l’esecuzione dello script mentre la seconda serve per accodare, tramite l’operatore di redirezione >>, il testo descrittivo nel file di log.

Se tutto procede come ci si attende le istruzioni xcopy, grazie all’opzione /D,copiano sulla destinazione i soli file modificati. Ciò consente una notevole efficienza dello script. L’opzione /E serve per copiare anche le cartelle vuote in modo da riportare sul disco di backup la reale struttura di origine. L’opzione /Y non chiede conferma per la sovrascrittura dei file.

Da notare l’uso dei doppi apici nel comando xcopy. Nell’esempio non sarebbero strettamente necessari ma risulterebbero indispensabili nel caso di percorsi con spazi presenti al loro interno.

Lo script può essere facilmente inserito nelle attività automatiche di Windows per essere lanciato, nel caso di server aziendali, preferibilmente di notte.

Carlo A. Mazzone

 

@ECHO OFF

CLS
ECHO ************************
ECHO *** BACKUP UTILITY ***
ECHO *** VER 1.1.3 ***
ECHO *** Carlo A. Mazzone ***
ECHO ************************

SET LOGFILE=c:\BackupLogs.txt
SET REMOTEDISK=X:

ECHO *********************** >> %LOGFILE%

DATE /T >> %LOGFILE%
TIME /T >> %LOGFILE%

ECHO Inizio operazioni …
ECHO Inizio operazioni >> %LOGFILE%

REM Test esistenza directory destinazione
IF not EXIST %REMOTEDISK% GOTO notarget

ECHO Copia CARTELLA_1 in corso …
ECHO COPIA CARTELLA_1 >> %LOGFILE%
xcopy “C:\CARTELLA_1\*.*” %REMOTEDISK%\DATI_BACKUP\ /E /D /Y >> %LOGFILE%

ECHO Copia CARTELLA_2 in corso …
ECHO COPIA CARTELLA_2 >> %LOGFILE%
xcopy “C:\CARTELLA_2\*.*” %REMOTEDISK%\DATI_BACKUP\ /E /D /Y >> %LOGFILE%

GOTO fine

:notarget
ECHO Errore – target NON disponibile >> %LOGFILE%
GOTO fine

:fine
DATE /T >> %LOGFILE%
TIME /T >> %LOGFILE%

ECHO Fine operazioni >> %LOGFILE%

ECHO *********************** >> %LOGFILE%

Supportaci condividendo sui social il nostro articolo!