Tag Archive - Batch

Firefox 3.5: ottimizzare il DB con VACUUM?

Scopro e studio un post uscito qualche giorno su Geekissimo, incuriosito da un test fatto da un amico sul forum di Mozilla Italia. Mi dice di aver provato quello strano tool disponibile per il download, dovrebbe riuscire a velocizzare l’avvio di Firefox.

Collegamento ad un anonimo Dropbox, scarico e apro dapprima con 7-Zip ed in seguito con Notepad++ per capire di cosa si tratta. Tutto si riassume nell’eseguibile di SQLite ed in un file batch che lancia un’istruzione secca sfruttando l’eseguibile stesso:


@FOR %%G IN (*.sqlite) DO ( sqlite3 %%G "VACUUM" )

Il comando VACUUM è ufficialmente sfruttato da SQLite e permette di:

When an object (table, index, or trigger) is dropped from the database, it leaves behind empty space. This empty space will be reused the next time new information is added to the database. But in the meantime, the database file might be larger than strictly necessary. Also, frequent inserts, updates, and deletes can cause the information in the database to become fragmented – scrattered out all across the database file rather than clustered together in one place.

In parole molto povere: dato un database di valori che vengono costantemente aggiornati (nel caso di Firefox succede con tutti i dati: segnalibri, password, cookie e altro ancora) la cancellazione di un qualsiasi dato lascia uno spazio “scoperto” (privo di valore) ma pur sempre conservato all’interno del DB. Il tutto succede fino al successivo riempimento di quello spazio. Ciò vuol dire che ci si trova davanti ad una normale “frammentazione” (lo stesso succede con l’hard disk ed un regolare uso del sistema operativo). Impossibile porre paletti a questa costante crescita, soprattutto con il passare del tempo.

Per questo motivo sarà possibile lanciare il comando VACUUM per:

The VACUUM command cleans the main database by copying its contents to a temporary database file and reloading the original database file from the copy. This eliminates free pages, aligns table data to be contiguous, and otherwise cleans up the database file structure.

… copiare i valori in un DB temporaneo per poi spostarli (tutto in modo automatico) nel DB originale a fine pulizia, con conseguente guadagno di spazio occupato su disco.

# quanti DB SQLite possiedo?

E’ presto detto. In un profilo standard sarà possibile trovare (grosso modo) questi file:

C:\Documents and Settings\Giovanni\Dati applicazioni\Mozilla\Firefox\Profiles\XXXX.default>dir *.sqlite
Il volume nell’unità C non ha etichetta.
Numero di serie del volume: XXXX-YYYY

Directory di C:\Documents and Settings\Giovanni\Dati applicazioni\Mozilla\Firef ox\Profiles\XXXX.default

10/07/2009  17.51             7.168 content-prefs.sqlite
15/07/2009  16.43           495.616 cookies.sqlite
15/07/2009  16.35             9.216 downloads.sqlite
15/07/2009  16.50           299.008 formhistory.sqlite
30/06/2009  18.17             2.048 permissions.sqlite
15/07/2009  16.50         9.252.864 places.sqlite
06/07/2009  19.22             2.048 search.sqlite
25/05/2009  08.18            11.264 signons.sqlite
26/05/2009  09.57             3.072 webappsstore.sqlite
9 File     10.082.304 byte
0 Directory  132.868.112.384 byte disponibili

C:\Documents and Settings\Giovanni\Dati applicazioni\Mozilla\Firefox\Profiles\XXXX.default>

Parliamo di circa 9 MB che dopo l’ottimizzazione sono passati a quasi 8, trattandosi di puro testo (salvato nei DB) non è affatto male ;-)

# il tool

Si tratta di un banale codice (comunque merito all’averci pensato) realizzato da InfoSpyware.com, il suo nome è IniFox, è stato presentato nel post (in lingua originale, spagnolo):

infospyware.com/blog/acelera-el-inicio-de-firefox-con-inifox

ed è disponibile gratuitamente anche su GxWare.org.

# la procedura

Innanzi tutto è d’obbligo mettere il solito avviso, che non fa mai male …

ATTENZIONE: Prima di eseguire qualsiasi modifica ai vostri file e/o dispositivi siete pregati di effettuare un backup di questi. Solo così sarete capaci di tornare indietro riparando ad eventuali errori di distrazione. L’articolo e l’autore non possono essere ritenuti responsabili di alcun danno subito dalla vostra strumentazione. Buon lavoro.

A questo punto i passi da seguire sono molto semplici, l’importante è aver scaricato e scompattato l’archivio contenente IniFox. Detto ciò, ecco il passo-passo:

  • CHIUDERE MOZILLA FIREFOX
  • Inserire i due file (batch & exe) di IniFox all’interno della cartella del proprio profilo. Per individuarla basterà consultare questo articolo nel support ufficiale di Mozilla Firefox: support.mozilla.com/it/kb/Profili#Individuare_la_cartella_del_profilo
  • Sarebbe bene fare un backup dei file *.sqlite dopo aver creato una cartella apposita. Personalmente ho optato per due veloci comandi dal prompt di MS-DOS, questo è quanto:

C:\Documents and Settings\Giovanni\Dati applicazioni\Mozilla\Firefox\Profiles\XXXX.default>mkdir backup_gioxx

C:\Documents and Settings\Giovanni\Dati applicazioni\Mozilla\Firefox\Profiles\XXXX.default>copy *.sqlite backup_gioxx
content-prefs.sqlite
cookies.sqlite
downloads.sqlite
formhistory.sqlite
permissions.sqlite
places.sqlite
search.sqlite
signons.sqlite
webappsstore.sqlite
9 file copiati.

C:\Documents and Settings\Giovanni\Dati applicazioni\Mozilla\Firefox\Profiles\XXXX.default>
  • A questo punto si potrà lanciare (doppio clic o sempre dal prompt di Ms-Dos) il file “IniFox.bat” e attendere la fine del processo.
  • Aprire ora Mozilla Firefox per notare (probabilmente) un minor tempo di caricamento dell’interfaccia principale.

Il processo può essere (ovviamente) ripetuto più volte nel tempo (magari lasciate passare una o due settimane tra un’ottimizzazione e l’altra) e -una volta tanto- non si tratta di applicativo invasivo che potrebbe mettere in pericolo i vostri dati (come invece spesso accade, nonostante si cerchi sempre di tenervi informati! ;)).

Cheers :-)

Batch: migrazione verso UltraVNC 1.0.6.0 (PRE)

Ricordate il post riguardante la migrazione di massa verso UltraVNC? Ho avuto modo di notare un comportamento anomalo da un cliente. Il concetto si riassume in: “Winvnc.exe va in crash ogni qual volta si tenta di aprire una finestra di Explorer” (non il browser, l’esplora risorse di Windows ;)) … nella casistica migliore si otteneva un freeze della finestra client per poi subire il “Socket error” nel caso in cui si tentasse la riconnessione.

Provate ad immaginare la felicità dell’utente ogni qual volta c’era da avviare un PsKill da remoto per buttare giù i processi appesi di winvnc.exe nell’attesa di avviarne uno nuovo funzionante …

Tentando di non migrare più postazioni possibili (dove ho appositamente lasciato RealVNC 4 o UltraVNC 1.0.2) e tenendo sotto costante controllo il forum di UltraVNC sono arrivato a testare il server (ed il viewer) della versione 1.0.6.0, non ancora ufficialmente rilasciata (quindi, prendetela come un “as-is” senza troppe garanzie, personalmente posso dirvi che funziona correttamente).

# cambio di programma

A monte c’era una richiesta più complessa dell’ultima volta. Lo script andrà inserito al logon, tra una mappatura di disco di rete ed una stampante per capirci, ciò vuol dire che dovrà essere capace di confrontare la versione del PC con quella sul server e decidere di aggiornare solo nel caso in cui quest’ultima sia più recente della prima controllata. Per questo motivo ho deciso di ricontrollare lo script, migliorarlo laddove fosse possibile e inserire il nuovo controllo a monte per abbandonare il batch nel caso in cui questo risulti “inutile“. Vediamo nello specifico le modifiche …

Il codice iniziale era stato pubblicato qui:

dev.gxware.org/?15

contrariamente al nuovo pubblicato invece su:

dev.gxware.org/?17

Il controllo che si occupa di confrontare la versione del server e -di conseguenza- decidere il da farsi è il seguente:

fc %programfiles%\UltraVNC\winvnc.exe \\NOME_FILESERVER\Install\Workstation\uvnc_silent\1060_pre\winvnc.exe > nul
IF ERRORLEVEL 1 goto STOPSERVIZI

fc” è un comando riconosciuto da DOS, la documentazione è disponibile a questo indirizzo:

computerhope.com/fchlp.htm

Permette di confrontare due file (qualsiasi) permettendomi così di capire se la versione del server è pari a quella della macchina locale e reagendo -di conseguenza- diversamente a seconda della risposta ottenuta. Il “goto STOPSERVIZI” viene infatti richiamato solo ed esclusivamente se il risultato del confronto dice che le versioni differiscono tra di loro.

L’altra modifica è presto detta / fatta, si tratta dell’installazione full di una versione 1.0.5.6 riconosciuta come stable dagli sviluppatori del tool di controllo remoto, alla quale verranno poi modificate “a cuore aperto” le versioni di server e client portandole sul ramo “pre” della prossima 1.0.6.0:

:INSTALL
echo.
echo *** Installazione nuova versione UltraVNC ***
echo.
if not exist %programfiles%\UltraVNC mkdir %programfiles%\UltraVNC\
copy \\NOME_FILESERVER\Install\Workstation\uvnc_silent\ultravnc.ini "%programfiles%\UltraVNC"
"\\NOME_FILESERVER\Install\Workstation\uvnc_silent\UltraVNC_1.0.5.6_Setup.exe" /verysilent /loadinf=\\NOME_FILESERVER\Install\Workstation\uvnc_silent\ultravnc.inf

echo.
echo *** Sovrascrittura con file pre-release 1060 ***
echo.
cd %programfiles%\UltraVNC
move winvnc.exe winvnc.exe.bak
move vncviewer.exe vncviewer.exe.bak
copy \\NOME_FILESERVER\Install\Workstation\uvnc_silent\1060_pre\winvnc.exe %programfiles%\UltraVNC\
copy \\NOME_FILESERVER\Install\Workstation\uvnc_silent\1060_pre\vncviewer.exe %programfiles%\UltraVNC\
cd \
cd %programfiles%\UltraVNC
start winvnc.exe
goto FINE

Chiaramente lo script verrà eseguito -ancora una volta- come amministratore di dominio, così che l’utente non debba “metterci mouse” durante il processo. Il file di configurazione gli verrà passato proprio come prima (in caso di nuova installazione o disinstallazione e passaggio a nuova versione) e ad installazione terminata sarà immediatamente possibile utilizzare il prodotto.

Stavolta non ho rilasciato il pacchetto completo e pronto da utilizzare, potete modificare il vecchio batch incollando il codice rilasciato in /dev e scaricare i file della 1.0.6.0 da questa discussione sul forum di UVNC.

Non mi resta che augurarvi buon lavoro :)

ancora una volta grazie a $cliente (lui sa chi) per avermi fatto divertire nella ricerca e nello sviluppo di soluzioni a lui adatte :)

Batch: update di massa per UltraVNC

Sto per tirarvi fuori il solito post “viaggio mentale” che spiega un metodo valido e funzionante (provato su strada) per aggiornare in modo massivo la versione di UltraVNC utilizzata magari nella vostra rete LAN, inserendo di default alcune impostazioni del programma, ivi compresi gruppi di dominio autorizzati a fare assistenza remota!

# conoscere il campo

La casistica affrontata riguarda una rete aziendale con dominio Microsoft, tutte macchine XP regolarmente aggiornate (e qualche Vista), utenti non amministratori del proprio PC, installazioni di UltraVNC (diverse versioni mai allineate) e RealVNC 4 miste. Tutti i computer montano diverse unità di rete all’avvio, tra queste si trovano la cartella personale ed una cartella generica per le installazioni software. Proprio grazie a quest’ultima -e qualche trucco batch- sarà possibile distribuire l’ultima versione dell’UltraVNC in modo totalmente automatizzato.

# cosa serve per partire

Basterà installare su una qualsiasi macchina (la prima, una cavia) l’UltraVNC (ultima release disponibile sul sito web ufficiale) configurandolo esattamente come vogliamo diventi su tutte le macchine della rete. Si parte avviando una piccola utility fornita nelle ultime release di UltraVNC:

uvnc_settings.exe” generalmente in C:ProgrammiUltraVNC (o Program Files per Windows Vista)

Questa permette di modificare e salvare (in un file .ini, ndr) tutte le impostazioni della parte server installata sulla macchina. Un file che -volendolo trasportare altrove con il giusto metodo- imposta già il comportamento di una nuova installazione UltraVNC:

Fatte le dovute modifiche, il file ultravnc.ini sarà esportabile altrove. Un consiglio? Create sul desktop (o una posizione a scelta) una cartella nella quale raccogliere tutti i file necessari alla migrazione, compresi gli script che andremo a creare tra breve, è nettamente più comodo.

Tocca ora ai gruppi di dominio autorizzati a collegarsi in VNC sulla macchina. Una volta inseriti a mano sul “PC Cavia“, UltraVNC salverà le informazioni in una chiave di registro che si trova in:

[HKEY_LOCAL_MACHINESOFTWAREORL]

il tutto codificato in HEX. Non preoccupatevi del contenuto ed esportate il .reg nella cartella precedentemente creata. Dovrebbe contenere una sola sottochiave ([HKEY_LOCAL_MACHINESOFTWAREORLWinVNC3]), dovrebbe assomigliare a qualcosa del genere:


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREORL]

[HKEY_LOCAL_MACHINESOFTWAREORLWinVNC3]
"ACL"=hex:02,00,50,00,02,00,00,00,00,00,24,00,03,00,00,00,01,05,00,00,00,00,00,
 05,15,00,00,00,6f,20,**,******,********0,00,24,00,
 **,****,*****,00,00,00,05,15,0*,**,00,6f,20,c3,5a,ff,1a,ef,4c,bf,
 7d,f7,6d,69,35,00,00

(chiaramente gli asterischi sono stati messi a random per offuscare il contenuto del .reg da me utilizzato).

Approfittate di questo momento per inserire nella solita cartella anche PSKill, tool della SysInternals (Microsoft) facente parte della suite PSTools, disponibile gratuitamente sul sito Microsoft:

technet.microsoft.com/en-us/sysinternals/bb896649.aspx

Servirà per terminare in modo sicuro il servizio winvnc eventualmente già aperto sulla macchina. Funziona allo stesso modo del taskman / taskkill via DOS ma in casi un pò più “recividi” con processi particolarmente rognosi da buttare giù, funziona decisamente meglio. L’unico problema è che l’applicativo, aperto per la prima volta sulla macchina, chiederà se accettare o meno la licenza di utilizzo, il tutto facilmente aggirabile tramite file di registro da avviare sulla macchina ospite:

Windows Registry Editor Version 5.00

[HKEY_USERSS-1-5-21-1522737263-1290738431-1844936127-13971SoftwareSysinternalsPsKill]

"EulaAccepted"=dword:00000001

Ultimo passaggio di “preparazione” è il file di informazioni di installazione *.inf, contenente le indicazioni su ciò che verrà installato sulla macchina, tutto abbastanza comprensibile con un minimo di impegno ;)


[Setup]
Lang=en
Dir=C:ProgrammiUltraVNC
Group=UltraVNC
NoIcons=0
SetupType=full
Components=ultravnc_server,ultravnc_viewer
Tasks=installservice,startservice

in sintesi: verrà installato UltraVNC nella directory predefinita (C:ProgrammiUltraVNC calcolando che stiamo parlando di client XP italiani), interfaccia in lingua inglese, senza icone sul Desktop, con componenti Server e Viewer tenendo conto che il servizio ultravnc_server verrà inserito tra quelli riconosciuti da Windows (Pannello di Controllo / Strumenti di amministrazione / Servizi) ed avviato da subito.

Basterà incollare quanto sopra riportato su un nuovo file Blocco Note (o editor di testo equivalente) e salvare il tutto come ultravnc.inf nella cartella della migrazione.

# contenuto finale della cartella

Se avete seguito alla lettera l’articolo (fino ad ora, chiaramente) dovreste trovarvi davanti ad una cartella così composta (grosso modo):

Andiamo ora a vedere come creare quel file install.bat che si occuperà di:

  • rilevare ed eventualmente disinstallare versioni di RealVNC 4 o precedenti
  • rilevare ed eventualmente disinstallare vecchie versioni di UltraVNC
  • installare l’ultima versione disponibile di UltraVNC caricata nella cartella dell’update con le impostazioni dettate dal file di informazioni d’installazione
  • impostare automaticamente le opzioni dell’UltraVNC appena installato con il file di configurazione precedentemente generato
  • aggiungere i gruppi autorizzati alla connessione sulla macchina che chiede assistenza e che ha appena “subìto” l’aggiornamento forzato

Mani ad un editor di testo, si parte.

# install.bat

Una veloce occhiata alle procedura permetterà di capire come strutturare poi uno script batch finale che controllerà dapprima la presenza degli applicativi per azionare in seguito le funzioni necessarie all’upgrade.

Stop dei servizi, è necessario

Lo stop dei servizi è chiaramente necessario per poter lavorare, a patto che siano effettivamente avviati. Per sicurezza è meglio provare a chiuderli a prescindere dal loro stato, giusto no? :)


echo *** Stop Servizi ***
echo.

net stop "uvnc_service"
net stop "VNC server"

Chi c’è c’è, gli altri si disinstallano

Ciò che va controllato è sicuramente la presenza del RealVNC 4 e di eventuali altre versioni di UltraVNC non pari all’ultima da noi scelta. Per questo motivo sarà necessario imporre al programma di effettuare da subito un “paio di ricerche incrociate“:


if exist %programfiles%RealVNCVNC4 goto REALVNC
if not exist %programfiles%UltraVNC goto INSTALL

A cosa corrispondono quei GOTO? Lo scopriamo subito :)

Rilevare e disinstallare RealVNC 4

Tutto molto semplice e, come ogni programma che si rispetti, prevede un parametro silent che si occuperà di fare il tutto senza che l’utente si accorga di nulla, peculiarità fondamentale in casi come questo:


:REALVNC
echo *** Rimozione RealVNC ***
"%programfiles%RealVNCVNC4unins000.exe" /verysilent /norestart
cd %programfiles%RealVNC
rmdir VNC4 /s /q
cd ..
rmdir RealVNC /s /q
echo.
echo Fatto, procedo.
goto CONTROLLO

Prevista chiaramente la distruzione delle cartelle riguardanti l’applicativo, proprio nelle ultime righe “rmdir“.

Rilevare e disinstallare vecchie versioni di UltraVNC

Anche in questo caso il programma si assicurerà che esista un’installazione di UltraVNC procedendo poi con una disinstallazione silente attraverso il precedente utilizzo di PSKILL per terminare il file eseguibile molto probabilmente ancora aperto:


:CONTROLLO
echo.
echo *** Rimozione vecchia versione UltraVNC ***
echo.

if exist %programfiles%UltraVNC "%programfiles%UltraVNCunins000.exe" /verysilent /norestart
if exist %programfiles%UltraVNC regedit /s \POSIZIONECARTELLAUPDATEpskill.reg
if exist %programfiles%UltraVNC \POSIZIONECARTELLAUPDATEpskill winvnc.exe
if exist %programfiles%UltraVNC rd %programfiles%UltraVNC /s /q
goto INSTALL

Prima di lanciare il PSKILL noterete l’associazione forzata del file di registro che permetterà di saltare la fase di accettazione licenza di utilizzo dell’applicativo. Inutile specificare che al posto di “POSIZIONECARTELLAUPDATE” dovrete sostituire la cartella esatta sul server che sta ospitando gli script ed i file di aggiornamento.

Installazione e configurazione automatica UltraVNC

Ultimo passo per concludere la procedura automatizzata. La funzione si occuperà di installare l’UltraVNC passandogli tutti i parametri decisi in precedenza, comprese password, gruppi di dominio e quant’altro ancora. Lo script non è neanche così complicato, i comandi diretti e le variabili utilizzate sono opera di Stefano (grazie!), ormai fondamentale quando si parla di scriptare in batch qui in ufficio :) Io non ho fatto altro che dare una veloce occhiata e mettere a posto qualche “piccola gaffe“:


:INSTALL
echo.
echo *** Installazione nuova versione UltraVNC ***
echo.
if not exist %programfiles%UltraVNC mkdir %programfiles%UltraVNC
copy \POSIZIONECARTELLAUPDATEultravnc.ini "%programfiles%UltraVNC"
regedit /s \POSIZIONECARTELLAUPDATEuvnc.reg
"\POSIZIONECARTELLAUPDATEUltraVNC_1.0.5.3_Setup.exe" /verysilent /loadinf=\POSIZIONECARTELLAUPDATEultravnc.inf
goto FINE

:FINE
echo Processo di aggiornamento terminato

Una volta creata la directory nella quale si andrà ad installare l’applicativo, si copia il file di impostazioni e si associa quel .reg precedentemente creato forzando il tutto da shell (regedit /s). Ora si potrà finalmente lanciare il setup, rigorosamente in silent, facendogli recuperare le informazioni che avevamo stabilito inizialmente (/loadinf=…).

Il gioco è fatto, UltraVNC si installerà e avvierà il servizio server al quale noi potremo “chiedere udienza” dopo poco per la prima volta, a conferma del corretto funzionamento dello script batch!

# avvertenze

La buona riuscita dell’installazione (o dell’aggiornamento) richiede l’essere puntigliosi nel controllare i puntamenti ai giusti server, le autorizzazioni in lettura per gli utenti di dominio, la presenza di tutti i file descritti. Ricordatevi che lo script va lanciato come amministratore di dominio o almeno della macchina locale (e qui può aiutarvi un psexec anche da remoto). Nel caso in cui vi dia problemi provate a segnalarmelo nei commenti per ottenere supporto.

Una versione completa del codice sorgente è disponibile su /dev:

dev.gxware.org/?15

chiaramente copiabile e modificabile a patto che, torno a ripetere, anche tutti gli altri file risiedano nella stessa cartella del batch che andrete a lanciare.

In un articolo che spero di poter scrivere e pubblicare a breve vi spiegherò come, attraverso l’ennesimo script, potrete lanciare a ripetizione il comando di psexec su tutte le macchine di una lista PC precedentemente generata, così da avviare anche questo script di mass-update senza il minimo sforzo.

Buon lavoro :)

Batch: migrazione di massa verso 7-Zip

Richiesta: migrare un discreto numero di client da WinZip o WinRAR a 7-Zip, forse il miglior software d’archiviazione gratuito ed open-source attualmente disponibile sul mercato, anche in italiano! Sono soddisfatto della scelta del mio cliente, soprattutto perché sono stato io stesso a mettere la pulce nell’orecchio :P

# il punto di partenza

Tutti i test sono stati effettuati su macchine provviste di WinZip 8.1 (minimo) e WinRAR 3.80. La mia virtuale montava esattamente queste due versioni durante lo sviluppo. Secondo i documenti che ho consultato, i comandi che ho utilizzato dovrebbero andare bene anche con versioni precedenti e successive a quelle utilizzate.

# il comportamento

Trovato WinZip o WinRAR o magari entrambi, lo script deve poterli disinstallare entrambi senza l’intervento dell’utente che sta attualmente utilizzando la macchina. Il motto è sempre lo stesso: meno l’utente finale vede e fa, meglio è. Ciò vuol dire uso di installazioni e disinstallazioni “silent” come previsto ormai nel 99% dei pacchetti di installazione degli applicativi.

WinZip, WinRAR e 7-Zip non fanno eccezione. Ciascuno di questi ha un parametro che permette di gestirli in “silenzio” e lontani da occhi indiscreti. Nello specifico, ho fatto riferimento ad un paio di forum stranieri dove ho trovato esattamente ciò che cercavo:

# raccogliere, analizzare, sviluppare

Raccogliendo i vari codici e parametri in giro per forum si riescono ad ottenere fin troppo facilmente i controlli da fare e sviluppare. Ecco quindi l’analisi dei vari “paragrafi” di codice!

Prima di partire vi ricordo che avrete necessità di tenere il file di installazione di 7-Zip sulla macchina locale dove applicare lo script o -soluzione certamente migliore in ambito aziendale- su un server al quale possono far accesso i vostri client. Tutto viene deciso sin da subito dalla variabile “server” dichiarata ad inizio batch, ovviamente da modificare secondo le proprie esigenze:


set server=

Un paio di esempi? Nel caso in cui all’interno del disco C abbiate creato una cartella “inst” contenente il pacchetto di installazione (attualmente 7z465.exe) bisognerà dichiarare %systemdir%\inst, proprio in questo modo:


set server=%systemdir%\inst

così facendo lo script richiamerà il setup con %systemdir%\inst\7z465.exe (quasi sempre corrisponderà a C:\inst\7z465.exe). Lo stesso vale per il server, cambia semplicemente il modo di richiamarlo:


set server=\\serverpippo\installazioni\sw\....

Sta alla vostra attuale situazione decidere che valore prenderà quella variabile. Non inserite il nome del pacchetto exe, il codice lo prevede già durante l’esecuzione.

Kill dei servizi WinZip e disinstallazione

WinZip e la sua odiosa icona nella tray fanno comparsa subito dopo l’installazione. E’ l’unico applicativo che necessita di un bel “TaskKill” via DOS che permette di terminare il QuickPick:


echo Termino eventuali servizi aperti da WinZip ...
echo;
taskkill /IM WZQKPICK.EXE
echo Fatto!

:WINZIP8
echo;
if not exist %programfiles%\WinZip\WINZIP32.EXE goto WINRAR
echo Disintallazione di WinZip in corso ...
echo;
%programfiles%\WinZip\WINZIP32.EXE /uninstallx

echo Fatto! 

Il primo controllo chiede allo script di assicurarsi che WinZip esista sulla macchina (if not exist … goto WINRAR), in caso contrario si salterà al controllo ed eventuale disinstallazione di WinRAR. Inutile dire che se WinZip viene trovato il codice proseguirà fino alla stringa “… WINZIP32.EXE /uninstallx” che lancia una disinstallazione completa e silente sulla macchina.

Controllo ed eventuale disinstallazione WinRAR

WinRAR è certamente meno invasivo del collega. Contrariamente a WinZip possiede un file di disinstallazione e l’attributo per il silent è molto più standard, basta un semplice “/s“:


if not exist %programfiles%\WinRAR\WinRAR.exe goto 7ZIP
echo Disinstallazione di WinRAR in corso ...
echo;
%programfiles%\WinRAR\Uninstall.exe /s
echo Fatto!

La prima stringa di controllo si assicura semplicemente che WinRAR esista, altrimenti salterà immediatamente all’installazione di 7-Zip!

Installare 7-Zip, alfin si giunge al risultato!

Installare 7-Zip e associarlo ai tipi di file più utilizzati e conosciuti è il passaggio finale della migrazione. La parte più corposa, manco a dirlo, riguarda proprio l’associazione dei file, e qui bisogna davvero ringraziare il forum di MSFN per aver già preparato uno script da integrare nel proprio batch per ottenere il risultato voluto.


if exist %programfiles%\7-Zip\7zFM.exe goto FINEPROCESSO
echo Installazione 7-Zip in corso ...
echo;
start /wait %server%\7z465.exe /S /D="%programfiles%\7-Zip\"

Il controllo è d’obbligo. Nel caso in cui la macchina possieda già 7-Zip si può tranquillamente concludere l’intervento “portando forzatamente a termine lo script“. In caso contrario ecco che la stringa di start provvederà a lanciare il setup dandogli in pasto la variabile silent (anche stavolta /s) e la destinazione già decisa per il programma. La variabile d’ambiente “%programfiles%” corrisponde a C:\Programmi nel 99% dei casi, ma è sempre meglio utilizzare indirizzi relativi piuttosto che gli assoluti no? ;)

Lo script delle associazioni è invece un costrutto “for” che per ciascuna estensione “desiderata” applicherà una nuova associazione nel registro di sistema, associando infine l’icona standard decisa da 7-Zip:


SETLOCAL
SET SC=HKLM\SOFTWARE\Classes
SET Extn=001 7z arj bz2 cab chm cpio deb gz iso lzh nsis rar rpm tar z zip
FOR %%j IN (%Extn%) DO (
REG ADD %SC%\.%%j /VE /D "7-Zip.%%j" /F
REG ADD %SC%\7-Zip.%%j /VE /D "7z Archive" /F
REG ADD %SC%\7-Zip.%%j\DefaultIcon /VE /D "\"%PROGRAMFILES%\7-Zip\Formats\%%j.dll\"" /F
REG ADD %SC%\7-Zip.%%j\shell\open\command /VE /D "\"%PROGRAMFILES%\7-Zip\7zFM.exe\" \"%%1\"" /F
)
REG ADD %SC%\7-Zip.001\DefaultIcon /VE /D "\"%PROGRAMFILES%\7-Zip\Formats\split.dll\"" /F
ENDLOCAL

Così facendo il risultato “è servito“, in meno di due minuti sulla macchina esisterà solo ed esclusivamente 7-Zip come gestore di pacchetti Zip/Rar e chi più ne ha più ne metta. Inutile dire che alle associazioni già presenti nello script potete aggiungerne altre previste -ovviamente- dall’applicativo.

Modifiche dell’ultima ora

(ultimo aggiornamento: 26.03.09 14.55)

Visto che la procedura di associazione file sembrava non funzionare altrettanto bene con le icone, Stefano ha leggermente modificato il codice includendo la risoluzione (grazie :P) che ora corrisponde al seguente:


SETLOCAL
SET SC=HKLM\SOFTWARE\Classes
SET Extn=001 7z arj bz2 cab chm cpio deb gz iso lzh nsis rar rpm tar z zip
FOR %%j IN (%Extn%) DO (
REG ADD %SC%\.%%j /VE /D "7-Zip.%%j" /F
REG ADD %SC%\7-Zip.%%j /VE /D "7z Archive" /F
REG ADD %SC%\7-Zip.%%j\shell\open\command /VE /D "\"%PROGRAMFILES%\7-Zip\7zFM.exe\" \"%%1\"" /F
)
REG ADD %SC%\7-Zip.001\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\Formats\split.dll" /F
REG ADD %SC%\7-Zip.7z\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,0" /F
REG ADD %SC%\7-Zip.arj\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,4" /F
REG ADD %SC%\7-Zip.bz2\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,2" /F
REG ADD %SC%\7-Zip.cab\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,7" /F
REG ADD %SC%\7-Zip.chm\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\Formats\chm.dll" /F
REG ADD %SC%\7-Zip.cpio\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,12" /F
REG ADD %SC%\7-Zip.deb\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,11" /F
REG ADD %SC%\7-Zip.gz\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,14" /F
REG ADD %SC%\7-Zip.iso\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,8" /F
REG ADD %SC%\7-Zip.lzh\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,6" /F
REG ADD %SC%\7-Zip.nsis\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\Formats\nsis.dll" /F
REG ADD %SC%\7-Zip.rar\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,3" /F
REG ADD %SC%\7-Zip.rpm\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,10" /F
REG ADD %SC%\7-Zip.tar\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,13" /F
REG ADD %SC%\7-Zip.z\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,5" /F
REG ADD %SC%\7-Zip.zip\DefaultIcon /VE /D "%PROGRAMFILES%\7-Zip\7z.dll,1" /F
ENDLOCAL

Ho chiaramente aggiornato lo script batch che ora include la nuova parte di codice e rilasciato il nuovo source su Dev:

dev.gxware.org/?13

# codice & download

Il codice sorgente del batch è disponibile gratuitamente ed interamente nell’area dev, come sempre:

dev.gxware.org/?12

dev.gxware.org/?13

mentre un batch già pronto è nel repository GxWare.org:

downloads.gxware.org/index.php?dir=articoli/7zip_migrazione/&file=7zip-install.bat

#riutilizzare il codice per un update

Nessuno vi vieta di modificare il nome del setup in futuro. Quando 7-Zip raggiungerà la versione 4.66, nel paragrafo dedicato alla sua installazione si potrà semplicemente cambiare il nome dell’eseguibile ricordandosi di andare poi a mettere il file di setup nella cartella dichiarata. Non è chiaramente stato sviluppato per aggiornare l’applicativo, ma con una “aggiustatina” qua e là potrebbe fare anche questo, magari ve lo spiego in un prossimo articolo eh? :)

# in conclusione

Un lavoro di 5 o più minuti portato a termine in due senza necessità di disconnettere l’utente attualmente connesso al sistema, basterà lanciare il batch come amministratore per risolvere il problema! :)

Proposte? Critiche? L’area commenti è a vostra disposizione!

Page 2 of 2«12