http://digilander.libero.it/Cenati

Quick Rename

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

 

 

 

 

 

Rinomina velocemente gruppi di file

Ho una macchina fotografica digitale che salva le foto partendo, ad ogni azzeramento della memoria, dallo stesso numero. Va tutto bene quando voglio stampare le foto di uno stesso periodo, mentre nascono dei problemi quando voglio stampare foto di periodi diversi e mi trovo file con lo stesso nome ma contenenti immagini diverse. Ma inoltre vorrei poter rinominare facilmente i file per ritrovarli in caso di ricerca. 

Ho visto su una rivista la recensione di un programma che permetteva di assegnare ad un gruppo di file dei nuovi nomi composti da una parte fissa e da un numero progressivo. Ad esempio Prova001, Prova002, Prova003, ecc.

Mi sono chiesto se era veramente necessario scaricare e installare un programma, anche se complesso e articolato, per fare una cosa così semplice. Infatti la sola funzione che mi interessa è quella di rinominare i file, senza accessori aggiuntivi. Aggiungo infine che le foto che ottengo stampate dal fotografo riportano sul retro il nome del file. Quindi se scrivo "Terme di merano 001.jpg" saprò dove è stata stampata la foto. Suggerisco quindi di far stampare le foto dopo averle rinominate.

Il programma si apre con il consueto controllo degli argomenti. Se ho lanciato il programma con il doppio click vengo avvisato circa le modalità di utilizzo: bisogna trascinare dei file sullo script.

Uso un vettore a due colonne e metto nella prima colonna i nomi dei file che sono stati passati come argomento. A causa di una limitazione di windows (ME), la somma dei caratteri che compongono i pathname dei filenon può superare 256. Nonostante questo è possibile cambiare il nome a parecchi file.

Il programma continua l'esecuzione chiedendoci la parte fissa del nuovo nome dei file ed il numero progressivo dal quale iniziare. Se scrivo "Prova" e poi "5", i miei file saranno rinominati in Prova005, Prova006, ecc. E' possibile usare anche più parole, ed anche terminare la parte fissa del nome con uno spazio. In questo modo si separerà il numero come in "Prova 005".

Lo script a questo punto inizia un ciclo per costruire il nuovo nome di ogni file, che sarà memorizzato nella seconda colonna della matrice.

Per far questo memorizzo innanzitutto gli elementi che non devono variare. L'estensione del file originale, innanzitutto, non deve essere modificata. Un jpg deve rimanere tale. Poi memorizzo il percorso del file originale, in quanto non voglio cambiare posto alle mie immagini.

Il nuovo nome di file viene ottenuto concatenando la parte fissa ("Prova ") con il numero progressivo che per l'occasione viene trasformato in testo. Il numero 1 viene trasformato in testo legandolo ai caratteri "000" e prendendo solo gli ultimi 3 caratteri. Quindi ottengo "0001" e prendo solo la parte finale "001". Se il numero progressivo iniziale fosse stato 997, l'avrei trasformato in "000997"; se fosse stato 85 sarebbe diventato "00085" e, prendendo gli ultimi tre caratteri, "085".

Alla fine del ciclo costruisco il nuovo nome del file e preparo un messaggio contenente il filename originale e quello creato da me. Questo messaggio viene mostrato in una finestra di Internet Explorer creata al momento (vedi l'articolo IEWindow per i dettagli) e si chiede conferma all'utente circa la volontà di rinominare i file.

Se la risposta è affermativa, la rinomina dei file è questione di una sola riga di programma: usando il metodo MOVE dell'oggetto FileSystemObject cambio il nome del file utilizzando i dati della matrice. Il primo elemento è il nome del file originario, il secondo è il nome nuovo. In caso un file esista già con il nuovo nome, lo script si blocca con un errore. Questo significa che non è possibile cancellare un documento per errore, ma solo cambiargli nome.

Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente questo script ed i successivi.

Per agevolarne l'uso, ho messo lo script nella cartella "SendTo" di Windows. Così posso selezionare le foto, cliccare col tasto destro e scegliere "invia a..." e poi Quickrename.

'*****************************************************
' QuickRename.vbs
' (c) Cenati Giovanni - http://digilander.libero.it/Cenati
' Scritto il 9 maggio 2007
' Codice vbs liberamente utilizzabile citando il sito
' Trascinare diversi file sull'icona del programma
' per modificare il nome dei files.
' Se il nome fisso inserito è "Test File " (con uno spazio alla fine)
' e il numero dal quale iniziare è 13,
' i files trascinati sullo script saranno rinominati, previa conferma,
' in Test "File 013.jpg", "Test File 014.jpg", "Test File 015.jpg", ecc.
' Il numero di files selezionabili dipende dalla lunghezza della
' riga di comando di windows. La somma dei caratteri dei nomi dei files
' passati come argomento non può superare 256.
' *****************************************************
Dim Filenames(1000,2)
Title= "QuickRename - by Cenati Giovanni"

Set objArgs = WScript.Arguments 'Vedo se c'è almeno un argomento passato allo script
If objargs.count=0 Then 'altrimenti mostro come si usa il programma
msg= "Trascinare diversi file sull'icona del programma "
msg=msg & "per modificarne il nome." & vbCrlf
msg=msg & "Si potrà scegliere il nome da dare ai files e un numero progressivo "
msg=msg & "da aggiungere. Come estensione sarà mantenuta quella originale. "
msg=msg & "Prima di rinominare i files viene chiesta conferma."
msgbox msg ,,Title
wscript.quit
End If

NumeroFiles = objargs.count -1

For i=0 To NumeroFiles
Filenames(i,1)= objArgs(i)
'Metto in una matrice il nome dei files da rinominare
Next

Set fso = CreateObject("Scripting.FileSystemObject")

NomeFisso = inputbox("Inserisci la parte fissa del nome da dare ai files", title)
NumIniziale = inputbox("Inserisci il numero dal quale iniziare la numerazione", title, "1")
NumIniziale = cint(NumIniziale)

msg=""

For i=0 To NumeroFiles
'Memorizzo l'estensione del file da rinominare
Estensione = fso.GetExtensionName(Filenames(i,1))
'Memorizzo il percorso del file e ci aggiungo un "\"
Percorso = fso.getparentfoldername(Filenames(i,1)) & "\"
'Trasformo in stringa "001" il numero che rappresenta il progressivo
Numero = right("000" & NumIniziale,3) 'es: Trasforma 5 in 005
'Costruisce il nuovo filename
Filenames(i,2)= Percorso & Nomefisso & Numero & "." & Estensione
'Prepara la riga con i due nomi di file.
msg=msg & Filenames(i,1) & " --> " & Filenames(i,2) & vbCrlf
NumIniziale = NumIniziale + 1 'Incrementa il numero progressivo
Next

'*** Crea una finestra che funge da output ***
Set myIE = CreateObject("InternetExplorer.Application")
myIE.Navigate "about:blank"
myIE.ToolBar = False:myIE.StatusBar = False:myIE.Resizable = False
Do
Loop While myIE.Busy
myIE.Width = 900:myIE.Height = 350
myIE.Left = 50:myIE.Top = 50
myIE.Visible = True
myIE.document.writeln("<html><title></title>"&_
"<body bgcolor=antiquewhite><div id='cont'></div></body></html>")
Set IEWindow = myIE.Document.All("cont")
'**********************************************

' Mostra la preview della modifica dei nomi dei files
IEWindow.INNERHTML = msg

risp= msgbox( "Conferma Rinomina dei files?",vbYesno,Title)
If risp=vbno Then MYie.QUIT:wscript.quit

'Se ha risposto si, procede a rinominare i files
For i=0 To NumeroFiles
fso.movefile Filenames(i,1),Filenames(i,2)
Next
MYie.QUIT
wscript.quit

Riesco a rinominare pochi files alla volta!

Lo script che ho descritto ha un limite nei 256 caratteri che compongono la riga di comando. Se ogni immagine da rinominare ha un pathname molto lungo, potrò cambiare il nome a solo un numero ridotto di files.

Ho scritto quindi due altri programmi che utilizzano al posto del drag&drop le finestre di dialogo di windows.

QuickRename2 (nello zip) usa una finestra di dialogo standard che però è utilizzabile solo sui pc sui quali è installato VisualBasic oppure alcuni runtime. Mi funziona al lavoro, dove ho i runtime di vb e di access ma non funziona a casa, dove non ho questi programmi. Funziona molto bene in quanto mostra una bella finestra di dialogo dalla quale scegliere i file da rinominare. In modalità "Anteprima" si possono vedere le foto in modo da sceglierle con più accuratezza. La finestra di dialogo restituisce una stringa con dati separati da un chr(0). Il primo dato è la cartella di provenienza dei files. Dal secondo dato in poi ho i singoli nomi dei file scelti, senza percorso.

Quindi per separare i dati devo usare Lista=Split(comDlg.FileName,Chr(0))

Poi per proseguire devo appiccicare Lista(0), cioè il percorso, a Lista(n), cioè il nome del file. In mezzo di devo mettere la backslash "\" perchè Lista(0) non la contiene.

QuickRename3 (anche questo nello zip) usa un metodo simile, ma disponibile in modo nativo su tutti i pc con xp. L'oggetto UserAccounts.CommonDialog mostra la stessa finestra di windows, ma per la selezione multipla permette solo di usare la vecchissima finestra di windows 3, con i nomi dei file in formato 8.3. 

In questo caso i dati forniti dalla finestra di dialogo sono separati da spazi anzichè da chr(0). E Lista(0) contiene anche la backslash. Sicuramente questa finestra di dialogo è molto più disagevole, ma se avete bisogno di rinominare molti file e non vi funziona QuickRename2 allora è comunque una buona alternativa a fare il lavoro a mano.

Purtroppo ero molto entusiasta di questa soluzione ma mi sono accorto che soffre di un limite analogo a quello della linea di comando. Se si selezionano molti file contemporaneamente, l'oggetto si comporta come se fosse stato premuto ANNULLA e non restituisce alcun nome file. 

Ho riscritto quindi lo stesso programma in AutoIt in modo da poter utilizzare la chiamata alle API di Windows per mostrare una vera finestra con multiselezione. Questo programma è incluso nello zip allegato. Funziona sia utilizzando il drag&drop sia aprendo la finestra di scelta file.

Giovanni Cenati

 

 

 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript