2012-02-21 16 views
13

Come scrivere un file batch o cmd che rinomina tutti i file in una directory? Sto usando Windows.Rinominare tutti i file in una directory con uno script batch di Windows

Modifica questo:

750_MOT_Forgiving_120x90.jpg 
751_MOT_Persecution_1_120x90.jpg 
752_MOT_Persecution_2_120x90.jpg 
753_MOT_Hatred_120x90.jpg 
754_MOT_Suffering_120x90.jpg 
755_MOT_Freedom_of_Religion_120x90.jpg 
756_MOT_Layla_Testimony_1_120x90.jpg 
757_MOT_Layla_Testimony_2_120x90.jpg 

A tal:

750_MOT_Forgiving_67x100.jpg 
751_MOT_Persecution_1_67x100.jpg 
752_MOT_Persecution_2_67x100.jpg 
753_MOT_Hatred_67x100.jpg 
754_MOT_Suffering_67x100.jpg 
755_MOT_Freedom_of_Religion_67x100.jpg 
756_MOT_Layla_Testimony_1_67x100.jpg 
757_MOT_Layla_Testimony_2_67x100.jpg 
+1

finestre e tutto ciò che viene eseguito in un file bat o .cmd? – Blainer

+0

Amico, se vuoi un aiuto non puoi aspettarti che tutti siano sensitivi. –

risposta

22

un'istruzione for per scorrere i nomi (tipo FOR /? aiuto), e stringa di ricerca e sostituzione (tipo SET /? for help) .

@echo off 
setlocal enableDelayedExpansion 
for %%F in (*120x90.jpg) do (
    set "name=%%F" 
    ren "!name!" "!name:120x90=67x100!" 
) 


AGGIORNAMENTO - 2012-11-07

ho studiato come il comando Rinomina offerte con caratteri jolly: How does the Windows RENAME command interpret wildcards?

Si scopre che questo particolare problema può essere risolto molto facilmente usando il comando RENAME senza bisogno di uno script batch.

ren *_120x90.jpg *_67x100.* 

Il numero di caratteri dopo il _ non ha importanza. La rinomina funzionerebbe ancora correttamente se 120x90 diventasse x o xxxxxxxxxx. L'aspetto importante di questo problema è che l'intero testo tra l'ultimo _ e lo . viene sostituito.

+2

Non sono sicuro che questo sia un esempio completo. Ma [This] (http://stackoverflow.com/a/3811991) ha funzionato per me come un fascino :) –

+2

@Anand - Ho aggiunto una soluzione molto più semplice usando solo il comando REN. Il link nel tuo commento è fondamentalmente uguale alla mia risposta originale. – dbenham

+0

Puoi dividere le tue due risposte? Lascerei il one-liner 'ren' in questo; è il migliore! –

8

A partire da Windows 7 è possibile eseguire questa operazione in una riga di PowerShell.

powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}" 

Spiegazione

powershell -C "..." lancia una sessione di PowerShell per eseguire il comando citato. Ritorna alla shell esterna al termine del comando. -C è l'abbreviazione di -Command.

gci restituisce tutti i file nella directory corrente. È un alias per Get-ChildItem.

| % {...} rende una pipeline per elaborare ogni file. % è un alias per Foreach-Object.

$_.Name è il nome del file corrente nella pipeline.

($_.Name -replace '120x90', '67x100') utilizza l'operatore -replace per creare il nuovo nome file. Ogni occorrenza della prima sottostringa viene sostituita con la seconda sottostringa.

rni modifica il nome di ciascun file. Il primo parametro (chiamato -Path) identifica il file. Il secondo parametro (chiamato -NewName) specifica il nuovo nome. rni è un alias per Rename-Item.

Esempio

$ dir 
Volume in drive C has no label. 
Volume Serial Number is A817-E7CA 

Directory of C:\fakedir\test 

11/09/2013 16:57 <DIR>   . 
11/09/2013 16:57 <DIR>   .. 
11/09/2013 16:56     0 750_MOT_Forgiving_120x90.jpg 
11/09/2013 16:57     0 751_MOT_Persecution_1_120x90.jpg 
11/09/2013 16:57     0 752_MOT_Persecution_2_120x90.jpg 
       3 File(s)    0 bytes 
       2 Dir(s) 243,816,271,872 bytes free 

$ powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}" 

$ dir 
Volume in drive C has no label. 
Volume Serial Number is A817-E7CA 

Directory of C:\fakedir\test 

11/09/2013 16:57 <DIR>   . 
11/09/2013 16:57 <DIR>   .. 
11/09/2013 16:56     0 750_MOT_Forgiving_67x100.jpg 
11/09/2013 16:57     0 751_MOT_Persecution_1_67x100.jpg 
11/09/2013 16:57     0 752_MOT_Persecution_2_67x100.jpg 
       3 File(s)    0 bytes 
       2 Dir(s) 243,816,271,872 bytes free 
+0

@MethodMan quale valore dovrebbe avere il timestamp? –

+0

L'ho capito facendo scherzi con lo script RobbCopy e creando una funzione goto all'interno del file bat. Grazie a PowerShell non mi è piaciuto molto ma se dovessi avere un valore di timestamp sarebbe "yyyymmddss' con una maschera che avrebbe '_1 _2 _3 ecc ...' dipende dal numero di file .. Sono stato in grado di farlo in un file batch usando robocopy .. – MethodMan

Problemi correlati