2014-08-30 25 views
7

Ho circa 1000 immagini e hanno un nome come "IMG-12223". Voglio rinominarli in 1 2 3 4 ... 1000. Come posso farlo. Ho scritto uno script batch che elenca i file ma non so come rinominare ogni file. per esempio. rinomina prima immagine con nome "IMG-12223" a 1, seconda immagine con nome "IMG-23441" a 2 e così via ...Rinominare più file in una directory utilizzando lo script batch

for /r %%i in (*) do (
    echo %c% 
) 
+0

Solo un suggerimento: il visualizzatore multimediale Freeware [IrfanView] (http://www.irfanview.com/) ha incorporato un [rinominazione batch] (http://graphicssoft.about.com/cs/renamers/ht /irfanviewrename.htm) funzione per rinominare le immagini con un contatore. Anche il gestore di file shareware [Total Commander] (http://www.ghisler.com/) ha una funzione [multi-rename] (http://www.ghisler.com/advanced.htm#tutorial_rename) con ancora più opzioni e molto facile da usare. A mio parere, non ha senso utilizzare un file batch per tale attività di ridenominazione di file che non viene eseguita automaticamente come operazione pianificata. – Mofi

risposta

12

Ecco lo script. Basta inserire lo script nella cartella ed eseguirlo.

@echo off & setlocal EnableDelayedExpansion 

set a=1 
for /f "delims=" %%i in ('dir /b *') do (
    if not "%%~nxi"=="%~nx0" (
    ren "%%i" "!a!" 
    set /a a+=1 
) 
) 

Se si desidera mantenere le estensioni, ad esempio rinominare "IMG-12223.jpg", "IMG-12224.jpg", ecc per "1.jpg", "2.jpg", ecc, può usare il seguente script

@echo off & setlocal EnableDelayedExpansion 

set a=1 
for /f "delims=" %%i in ('dir /b *.jpg') do (
    ren "%%i" "!a!.jpg" 
    set /a a+=1 
) 

[Aggiornamento] Here're spiegazioni per le linee di cui al commento di Jack.

  • setlocal EnableDelayedExpansion

In generale, vogliamo la variabile a essere ritardato di espansione quando è eseguito, ma non la linea viene letto. Senza di esso, la variabile a non può ottenere il suo valore aumentato ma sempre 1.

Per il dettaglio di EnableDelayedExpansion, fare riferimento alla risposta https://stackoverflow.com/a/18464353/2749114.

  • for /f "delims=" %%i in ('dir /b *.jpg')

Qui dir con /b opzione, elenchi di file solo i nomi di tutti i file jpg.

Il ciclo for attraversa e rinomina tutti i file jpg.

Per l'opzione delims, poiché il carattere delimitatore predefinito è uno spazio, senza l'opzione delims=, non riesce con i file di immagine con spazi nei nomi file. OSSIA per un file immagine denominato "img with spaces.jpg", senza l'opzione, il valore di %%i è "img" ma non l'intero nome "img con spaces.jpg", che non è corretto.

Per il ciclo for, fare riferimento alla pagina http://ss64.com/nt/for_f.html.

  • if not "%%~ni"=="%~n0"

devo cambiare a if not "%%~nxi"=="%~nx0" per essere più precisi. E i codici allegati sono stati aggiornati.

In realtà è usato per evitare di rinominare il file bat stesso. Se limitiamo la ridenominazione solo su file "jpg", la riga non è necessaria.

%%~nxi è il nome del file con estensione per ogni file attraversato. E %~nx0 è il file bat in esecuzione con estensione. Per dettagli, fare riferimento alla pagina DOS BAT file equivalent to Unix basename command?.

+0

Grazie per la risposta, potresti spiegare le seguenti righe "setlocal EnableDelayedExpansion", "per/f" delim = "%% i in ('dir/b * .jpg')", se non "%% ~ ni" == "% ~ n0" –

+0

Certo, ho appena migliorato lo script e ho anche aggiunto delle spiegazioni alle righe che hai menzionato. In realtà si può anche cambiare lo script un po 'per prendere la directory delle immagini come parametro. – Landys

0

Prova questo, hai una coppia di namevalues ​​in un file di testo, quindi fai un loop dei valori e fai la magia. Le Namevalue sono separate da spazi vuoti. Ciò ti consente di mappare i vecchi -> nuovi nomi di conseguenza. Oppure mantieni il contatore idx + 1 e usalo per i nuovi nomi di file.

keyvalue.bat

@echo off 
set idx=0 
for /F "tokens=1,2" %%A in (keyvalue.txt) do call :PROCESS "%%A" "%%B" 
GOTO :END 

:PROCESS 
set var1=%~1 
set var2=%~2 
set /A idx=%idx%+1 
echo %var1% goes to %var2% (%idx%) 
GOTO :EOF 

:END 
pause 

keyvalue.txt

file888.dat newfile1.dat 
file333.dat newfile2.dat 
file9.dat newfile3.dat 
file01.dat newfile4.dat 
7

Non v'è alcun bisogno di uno script batch. Un semplice liner dalla riga di comando può fare il lavoro :-)

Io uso DIR/B per generare l'elenco di file, inviato a FINDSTR per numerare i file, il tutto racchiuso con FOR/F per analizzare il risultato e eseguire il cambio di nome.

for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB" 

Raddoppiare le percentuali se si desidera inserire il comando in uno script batch.

Problemi correlati