Tag Archive - 7-Zip

Nome del file troppo lungo: come aggirare facilmente il problema

E’ un problema che si verifica abbastanza spesso, soprattutto quando gli utenti tendono a voler archiviare i documenti sotto trafile di cartelle sempre più specifiche, più dettagliate, arrivando quindi a più di 255 caratteri totali di profondità nell’URL completo. Giusto ieri ho dovuto spostare alcuni vecchi file EML verso un altro disco, e alcuni di questi sono stati bloccati per il nome troppo lungo (prima da Windows, poi da DOS, in un rapido tentativo di aggirare facilmente il problema, fallito inesorabilmente!):

Nonostante sul web si possano trovare le soluzioni più strambe, software di ogni tipo o metodi tantrici per la risoluzione di questo fastidioso caso, c’è una soluzione a portata di chiunque, molto più semplice e immediata, che nella maggior parte dei casi non richiederà l’installazione di software aggiuntivo, ammesso che voi siate -come me- utilizzatori di 7-Zip, noto compressore / decompressore open-source disponibile gratuitamente su Sourceforge, sulla pagina ufficiale 7-zip.org.

Basterà aprire il File Manager, navigare fino alla cartella desiderata e rinominare i file che prima non potevano essere rinominati:

Buon lavoro! :-)

Sophos: batch backup SQL

Un processo troppo spesso sottovalutato è quello del backup, talvolta anche in azienda (sigh!). La colpa viene sempre data al poco tempo a disposizione, alla poca voglia forse, sporadicamente del non sapere dove / come / quando fare un backup. Oggi ho notato che ho predicato bene ma ho razzolato male fino all’ultimo momento, il server antivirus aziendale non effettuava regolare backup SQL quotidianamente.

Per questo motivo ho deciso di rimediare e mettere in piedi un processo automatico che svolge lo sporco lavoro ogni notte, operazione schedulata alle 3.00 per l’esattezza.

Mi sono servito ancora una volta di uno script batch, il 7-Zip Command Line Version, l’eseguibile sleep presente nel Windows 2003 Server Resource Kit e di un secondo batch già presente in tutte le installazioni di Sophos (%programfiles%\Sophos\Enterprise Console\DB\BackupDB.bat).

Prima di partire vi invito a copiare il 7za.exe ed lo sleep.exe all’interno della cartella Windows\System32 della vostra macchina, così da poter essere richiamati facilmente dal prompt di MS-Dos.

Lo script è davvero semplice, può essere salvato in qualsiasi posizione. Nel mio caso ho deciso di lasciarlo in %programfiles%\Sophos.

Prima il codice, poi la spiegazione :-)


@echo off
cls
echo Backup Database SOPHOS su macchina locale
echo;
echo Controllo esistenza cartella bck su disco C ...
echo;
if not exist C:\bck mkdir C:\bck
cd "%programfiles%\Sophos\Enterprise Console\DB"
echo Avvio procedura di backup Database ...
echo Tempo di attesa: 20 sec.
for /f "tokens=1-3 delims=/- " %%a in ('date /t') do set xdate=%%a_%%b_%%c
start /min BackupDB.bat C:\bck\sophos_%xdate%.sql SOPHOS
sleep 20
echo;
echo Backup effettuato.
echo;
echo Compressione con 7zip ...
echo;
7za.exe a -t7z -mx5 C:\bck\sophos_%xdate%.7z C:\bck\sophos_%xdate%.sql
echo;
echo Cancellazione file temporanei ...
del C:\bck\sophos_%xdate%.sql
echo;
echo Processo terminato

La cartella usata per tenere in piedi i backup è la C:\bck, potete tranquillamente cambiarla sostituendola nello script. Sappiate comunque che il batch di Sophos gestisce meglio i nomi di cartelle senza spazi al loro interno, regolatevi di conseguenza ;)

Per differenziare le versioni dei backup ho deciso di includere la data. Il parametro funzionante sotto DOS è “%date%” che però restituisce un valore come questo qui di seguito:


C:\Documents and Settings\Giovanni>echo %date%
24/07/2009

C:\Documents and Settings\Giovanni>

motivo per il quale diventa necessario sostituire quegli slash con qualcosa di più compatibile. Il ciclo for inserito nello script permette di farlo inserendo gli underscore perfettamente compatibili con il batch di Sophos (e con il mio!), generando un nuovo valore %xdate% richiamabile in qualsiasi momento.

Lo sleep.exe viene richiamato nel frattempo che va in funzione lo “start BackupDB.bat” che si preoccupa di effettuare in una finestra minimizzata il file SQL di esportazione dall’Enterprise Console. 20 secondi bastano e avanzano per un file che racchiude informazioni per un totale di circa 200 macchine. Nel vostro caso potrebbe essere necessario aumentare il numero di secondi (dipende da quanto è grande l’esportazione).

Il funzionamento (molto elementare) del batch BackupDB realizzato da Sophos è spiegato nel /? lanciato da DOS, lo riporto:


C:\Program Files\Sophos\Enterprise Console\DB>BackupDB.bat

Usage:
 BackupDB backup_file_path [instance_name]

C:\Program Files\Sophos\Enterprise Console\DB>

altrimenti bisognerebbe far riferimento alla procedura manuale, spiegata in un documento della KB Sophos.com all’indirizzo:

sophos.com/support/knowledgebase/article/27265.html

Finito il backup si passa alla compressione grazie alla riga di comando del 7za precedentemente copiato nella Windows\System32. La riga che lancia la compressione del file SQL indica all’applicativo la necessità di generare un file 7z (-t7z) con compressione normale dandogli lo stesso nome del file originale. Per conoscere tutti i segreti della riga di comando di 7za vi rimando ad un fantastico documento, davvero completo:

http://dotnetperls.com/7-zip-examples

Il processo di compressione potrebbe anche impiegare diversi minuti (15 / 20 talvolta) ma schedulando questo lavoro a notte fonda non penso ci siano grossi problemi di sovraccarico della macchina, giusto? ;-)

Come chicca finale si cancella il file *.SQL recuperando spazio sul disco e mantenendo solo il .7z compresso.

Basterà ora aggiungere alle Operazioni Pianificate del sistema il lancio quotidiano (o settimanale se più vi aggrada) del batch, all’ora esatta desiderata.

Cheers.

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!