Omdøb alle filer i en mappe med et Windows-batch script

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan skulle jeg skrive en batch eller cmd-fil, der omdøber alle filer i en mappe? Jeg bruger Windows.


Skift dette:


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


Til dette:


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

Bedste reference


En FOR-sætning til at løbe gennem navnene (type FOR /? for hjælp), og streng søgning og erstat (type SET /? for hjælp).


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



UPDATE - 2012-11-07


Jeg har undersøgt, hvordan RENAME-kommandoen handler med jokertegn: Hvordan fortolker kommandoen Windows RENAME jokertegn? [30]


Det viser sig, at dette særlige problem kan løses meget nemt ved hjælp af kommandoen RENAME uden behov for et batch script.


ren *\_120x90.jpg *\_67x100.*


Antallet af tegn efter \_ betyder ikke noget. Omnavnet vil stadig fungere korrekt, hvis 120x90 blev x eller xxxxxxxxxx. Det vigtige aspekt ved dette problem er, at hele teksten mellem den sidste \_ og . erstattes.

Andre referencer 1


Fra Windows 7 kan du gøre dette i en linje med PowerShell.


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


Forklaring



powershell -C "..." lancerer en PowerShell-session for at køre den citerede kommando. Den vender tilbage til den ydre skal, når kommandoen fuldendes. -C er kort for -Command.


gci returnerer alle filerne i den aktuelle mappe. Det er et alias for Get-ChildItem. [31]


| \% {...} gør en pipeline til at behandle hver fil. \% er et alias for Foreach-Object. [32]


$\_.Name er navnet på den aktuelle fil i rørledningen.


($\_.Name -replace '120x90', '67x100') bruger -replace operatøren til at oprette det nye filnavn. Hver forekomst af den første substrikt erstattes med den anden substring. [33]


rni ændrer navnet på hver fil. Den første parameter (kaldet -Path) identificerer filen. Den anden parameter (kaldet -NewName) angiver det nye navn. rni er et alias for Omdøb-vare. [34]


Eksempel



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

 Directory of C:fakedir	est

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	est

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