31237 Letture

Come rinominare una serie di file con Powershell

La necessità di rinominare gruppi di file è piuttosto frequente. Spesso si può sentire il bisogno di eliminare del testo presente nel nome di una serie di file oppure aggiungere un prefisso o un suffisso.

Per rinominare file in blocco sono oggi disponibili diversi strumenti software ma perché installare un programma apposito se Windows già integra tutto il necessario per procedere?

Rinominare file in Windows: come si fa

Già anni fa, nell'articolo Rinominare file e cartelle in Windows senza usare altri software, abbiamo visto com'è possibile cambiare il nome ad una serie di file assegnando la stessa denominazione di base e un numero progressivo.
L'interfaccia di Windows (Esplora file) e il prompt dei comandi permettono infatti di rinominare file in blocco aggiungendo il suffisso numerico incrementale (1), (2), (3) e così via.
Nel caso di Esplora file basta selezionare gli elementi da rinominare (CTRL+A per sceglierli tutti), quindi cambiare il nome al primo file premendo il tasto F2 o il pulsante Rinomina.

Dal tradizionale prompt dei comandi si possono effettuare alcune modifiche in più ma nulla di lontanamente paragonabile a quanto è possibile fare ricorrendo a PowerShell.


PowerShell è una shell caratterizzata da un'interfaccia a riga di comando e da un versatile linguaggio di scripting che permette di eseguire ogni genere di operazione, anche quelle apparentemente più complesse.

Come avviare PowerShell

Per accedere a PowerShell, è sufficiente premere la combinazione di tasti Windows+X quindi scegliere la voce Windows PowerShell.


In Windows 10 se si vedesse ancora Prompt dei comandi all'interno del menu, basterà digitare Sostituisci il prompt dei comandi con Windows PowerShell nella casella di ricerca del menu Start e attivare l'opzione Sostituisci il prompt dei comandi con Windows PowerShell quando si fa clic con il pulsante destro del mouse nell'angolo inferiore sinistro o si premere il tasto Windows+X.


Per rinominare file in blocco non sono di norma necessari i diritti di amministratore; se tuttavia si stesse operando su file altrui (ad esempio quelli memorizzati nelle cartelle di un altro account utente) bisognerà necessariamente avviare e usare Powershell assegnandogli privilegi maggiori (Windows PowerShell, amministratore).

Per aprire PowerShell e portarsi subito nella cartella aperta in Esplora file, suggeriamo di tenere premuto il tasto MAIUSC quindi cliccare con il tasto destro del mouse in un'area libera della cartella scegliendo infine Apri finestra PowerShell qui.


Rinominare una serie di file rimuovendo alcuni caratteri

Prima di iniziare a lavorare con Powershell, suggeriamo di creare una copia di backup dei file che saranno rinominati. Nel caso in cui si dovessero commettere errori, si potranno così agevolmente ripristinare le copie originali dei file, con i nomi iniziali.

1) Uso corretto delle variabili d'ambiente con PowerShell

Dalla finestra di Powershell, usando il comando cd ci si potrà portare nella cartella contenente i file da rinominare (esempio: cd C:\Users\Michele\Documents\test).
Si possono anche usare le variabili d'ambiente: %userprofile% in PowerShell diventa $env:userprofile.
Esempio: cd $env:userprofile\Documents

2) Sostituire un testo nel nome di una serie di file

Per rinominare una serie di file sostituendo un carattere o una sequenza di caratteri, si potrà quindi digitare quanto segue:

dir | Rename-Item -newname { $_.name -replace "stringa_da_cercare","stringa da sostituire" }

Come rinominare una serie di file con Powershell

Nell'esempio in figura, rimuoviamo la stringa Diapositiva1 dai nomi di tutti i file presenti nella cartella corrente.


3) Cercare i file che contengono il termine indicato e sostituire una parte del nome con un'altra

L'istruzione seguente permette di rinominare - effettuando la sostituzione specificata - solo quei file che contengono il termine indicato in qualunque parte del nome:

Get-ChildItem -Filter "*termine*" -Recurse Rename-Item -newname { $_.name -replace "stringa_da_cercare","stringa da sostituire" }

In questo caso abbiamo usato anche l'approccio ricorsivo (-Recurse) in modo tale che l'intervento interessi anche le eventuali sottocartelle.

Esempio:
Get-ChildItem -Filter "*sesamo*" -Recurse rename-item -newname { $_.name -replace "TEST_","OK_" }
Sostituisce la stringa TEST_ con OK_ solo per quei file che - in qualunque parte del loro nome - contengono il termine "sesamo".

Aggiungere un prefisso o un suffisso al nome dei file

Se si volesse invece rinominare una serie di file e aggiungervi un prefisso, basterà digitare quanto segue:

dir | Rename-Item -NewName {"PREFISSO_" + $_.Name}


Nel caso in cui si volesse aggiungere invece un suffisso basterà, banalmente, usare:

dir | Rename-Item -NewName {$_.Name + "_SUFFISSO"}

Si possono anche combinare altre informazioni. Ad esempio, l'istruzione che segue aggiunge come prefisso il nome della cartella a quello di tutti i file in essa memorizzati:

dir | Rename-Item -NewName {$_.Directory.Name + "_" + $_.Name}

Cambiare l'estensione di un insieme di file

Per rinominare un insieme di file modificandone l'estensione, si potrà usare quanto segue:


Get-ChildItem *.txt | Rename-Item -newname { $_.name -replace '\.txt','.log' }

In questo caso, tutti i file con estensione .txt verranno automaticamente rinominati ricorrendo all'estensione .log.

Rinominare file in blocco e assegnare un numero progressivo a ciascuno di essi

Per rinominare file in sequenza e fare in modo che PowerShell aggiunga al loro nome un numero progressivo, suggeriamo di digitare al prompt quanto segue:

$nr=1
dir | %{Rename-Item $_ -NewName ("FOTO_{0}.jpg" -f $nr++)}


Alla variabile $nr si dovrà assegnare il numero dal quale deve partire il contatore. Ad esempio, scrivendo $nr=9, al primo file rinominato verrà attribuito il nome FOTO_9.jpg, al secondo FOTO_10.jpg e così via.

E se si volesse fare in modo che ai file venga assegnato un numero crescente nella forma 01, 02, 03… e così via oppure 001, 002, 003,... a seconda del numero di file presenti nella cartella?
Si può risolvere il problema brillantemente usando il comando che segue:

$id=1; $pref="FILE_"; $files=gci -Path ".\*.jpg"; $nfiles=($files.count.tostring()).length; $files | foreach { Rename-Item -Path $_.fullname -NewName ( $pref+((($id++).tostring()).padleft( $nfiles ) -replace ' ','0' ) + $_.extension) }

Al posto di FILE_ si può indicare il prefisso da usare come nome per ciascun file rinominato.
Nell'esempio la cmdlet Get-ChildItem (gci è la sua abbreviazione o forma compatta che restituisce analogo risultato) estrae la lista dei file JPG memorizzati nella cartella corrente (ovviamente si possono specificare altri percorsi o indicare altri tipi di file…) quindi viene creata una stringa con un numero di 0 a seconda del quantitativo di file presenti nella cartella. Se si avranno da 100 a 999 file, ad esempio, si avranno tre 0, da 1000 a 9999 quattro 0 e così via.
Con il metodo padleft si ottiene una nuova stringa di lunghezza specificata in cui alla parte iniziale della stringa vengono aggiunti gli zeri ove necessario (più a destra resta il contatore del numero di file aggiornato in modo incrementale: $id++).


Modificando il valore della variabile $id, nell'esempio impostato a 1, si può variare il valore di partenza del contatore.

Infine, è interessante evidenziare che dalla finestra di Powershell è comunque possibile usare buona parte dei comandi che si era abituati a usare dal prompt classico (cmd).
Per chiudere la finestra di Powershell, basta digitare il comando exit.

Per approfondire i possibili utilizzi di PowerShell, suggeriamo la lettura dell'articolo PowerShell per esempi: cosa si può fare.

  1. Avatar
    grmail1
    25/04/2018 17.33.38
    Spero di aver individuato la discussione giusta :)
    Ho necessità di rinominare in modo massivo qualche centinaia di file. Ho visionato e provato alcuni programmi: Advanced Renamer, Lupas Renamer e Renamer, senza riuscire a fare quanto segue.

    Ho delle stringhe come la seguente
    COGNOME_MIUR.AOODR.Reg_reg_dei_decreti_direttoriali.1111.31-08-2017.pdf
    e voglio trasformarla in
    CODICEFISCALE-COGNOME_1111.31-08-2017.pdf

    La rinomina in senso stretto e l'accorciamento non è un problema con i programmi di cui sopra, ma l'inserimento del CF si (almeno per me) perché si tratta di prendere i CF e i cognomi da un file xls o cvs (o ev. txt).

    Insomma, ciò di cui ho bisogno è una sorta di "fusione di stampa" che verificato il cognome (nel nome file con il cognome nel file xls/cvs), agganci nel file xls/cvs il codice fiscale corrispondente al nome, aggiungendolo in testa al nome del file.

    Fantascienza ... o realtà? ;)

    Giovanni
  2. Avatar
    Sampei Nihira
    25/05/2016 18.18.50
    Già che siamo in argomento....
    Avete fatto caso che in pc x64 ci sono 4 exe Powershell ?

    Vado avanti.
    In Powershell il comando:

    Get-ExecutionPolicy

    restituisce la voce "Unrestricted"

    in Powershell (x86) lo stesso comando restituisce "Restricted"

    Un quadro completo si ha inserendo il valore -list al comando sopra.
Come rinominare una serie di file con Powershell - IlSoftware.it