Windows-batch script til omdøbning af filer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har mange filer i en Windows-mappe. Disse filnavne indeholder også mange understregninger. F.eks.:



ad\_iod\_errr\_opp12.txt  
ghff\_jjk56.txt  
opr\_sdr\_ot\_wrr\_12ee.txt  



Jeg vil omdøbe disse filer, så den sidste understregning og alt, der følger med den, fjernes, og filerne omdøbes som følger:



ad\_iod\_errr.txt
ghff.txt
opr\_sdr\_ot\_wrr.txt



Bemærk: Antallet af understreger varierer. Nogle filnavne kan kun have en enkelt understregning, mens andre filnavne kan have op til 8 understregninger. Jeg leder efter et Windows-batch script, der kunne gøre tricket og ikke PowerShell-kommandoer.


Dette er den kode, jeg bruger for øjeblikket til at omdøbe filerne, da filnavne kun har et understreget i det:


@ECHO OFF 
SETLOCAL 
cd C:Usersambika.narayan.raoJenkinsWorkspace 
SET "fname=*.txt" 
FOR \%\%i IN ("\%fname\%") DO FOR /f "delims=\_" \%\%j IN ("\%\%i") DO ren "\%\%~i" "\%\%~j\%\%~xi" 
GOTO :EOF

Bedste reference


@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:sourcedir"
FOR /f "delims=" \%\%a IN (
 'dir /b /a-d "\%sourcedir\%*\_*.txt" '
 ) DO (
 SET "filename=\%\%a"
 set "partsname=!filename:\_= \_!"
 FOR \%\%b IN (!partsname!) DO SET "newname=!filename:\%\%b=!\%\%~xa"
 ECHO REN "\%sourcedir\%\%\%a" "!newname!"
)

GOTO :EOF


Du skal ændre indstillingen for sourcedir for at passe til dine forhold.


De nødvendige REN-kommandoer er kun ECHO ed til testformål. Når du har bekræftet, at kommandoerne er korrekte , skal du ændre ECHO(REN til REN for at omdøbe filerne.


Udfør en mappe scan af alle filnavne, der matcher masken. Med hvert navn fundet ved hjælp af forsinket ekspansion, tildeles navnet til filename og erstatter derefter hver \_ med Mellemrum \_


Brug en simpel for til at tildele newname til det oprindelige filnavn med \_string fjernet (erstattet af ingenting ) og tilføj forlængelsen ved hjælp af \%\%~xa . Den sidste streng tildelt \%\%b vil være \_laststring.ext, så værdien tildelt newname passer til behandlingskravet, så omdøb filen.

Andre referencer 1




Her er et ændret script, som jeg skrev i et andet svar, idet jeg stolte på et godt hack for at fjerne den sidste del af en streng adskilt af et bestemt tegn - understregningen \_ i dette tilfælde. Bemærk, at dette mislykkes, hvis nogen af ​​filerne indeholder udråbstegn ! i deres navne. Så dette er koden:


@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "\_SOURCE=\%~dp0."
set "\_MASK=*\_*.txt"

rem // Enumerate all matching files:
for /F "delims= eol=|" \%\%F in ('dir /B /A:-D "\%\_SOURCE\%\%\_MASK\%"') do (
    rem // Store current file name and extension:
    set "FILE=\%\%~nF" & set "FEXT=\%\%~xF"
    rem // Call sub-routine that removes the last `\_`-separated part:
    call :GET\_LAST\_ITEM LAST RMND "\%\%~nF"
    rem // Enable delayed expansion to be able to read the variables:
    setlocal EnableDelayedExpansion
    rem /* Actually rename current file: */
    ECHO ren "!FILE!!FEXT!" "!RMND!!FEXT!"
    endlocal
)

endlocal
exit /B


:GET\_LAST\_ITEM  rtn\_last  rtn\_without\_last  val\_string
    ::This function splits off the last `\_`-separated item of a string.
    ::Note that exclamation marks must not occur within the given string.
    ::PARAMETERS:
    ::  rtn\_last            variable to receive the last item
    ::  rtn\_without\_last    variable to receive the remaining string
    ::  val\_string          original string
    setlocal EnableDelayedExpansion
    set "STR=\_\%~3"
    set "PRE=" & set "END=\%STR:\_=" & set "PRE=!PRE!\_!END!" & set "END=\%"
    endlocal & set "\%~1=\%END\%" & set "\%~2=\%PRE:~2\%"
    exit /B


For at kunne håndtere filnavne med udråbstegn korrekt, er her en anden tilgang:


@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "\_SOURCE=\%~dp0."
set "\_MASK=*\_*.txt"

rem // Enumerate all matching files:
for /F "delims= eol=|" \%\%F in ('dir /B /A:-D "\%\_SOURCE\%\%\_MASK\%"') do (
    rem // Store current file name and extension:
    set "FILE=\%\%~nF" & set "FEXT=\%\%~xF"
    rem // Initialise some variables:
    set "NAME=" & set "ITEM="
    rem // Toggle delayed expansion to not lose `!` in file names:
    setlocal EnableDelayedExpansion
    rem /* Loop through all partial file names separated by `\_`; since every
    rem    `\_` is replaced by `" "` and the whole string is enclosed in `""`,
    rem    we effectively get a list of quoted file name parts, which were
    rem    originally separated from each other by `\_`: */
    for \%\%I in ("!FILE:\_=" "!") do (
        rem /* Rebuild file name but delayed by one name part; the `for /F` loop
        rem    iterates once and transports the result beyond `endlocal`: */
        for /F "delims= eol=|" \%\%E in ("!NAME!!ITEM!\_") do (
            endlocal
            set "NAME=\%\%E"
        )
        rem // Belatedly store currently iterated file name part:
        set "ITEM=\%\%~I"
        setlocal EnableDelayedExpansion
    )
    rem /* Actually rename current file; superfluous leading and trailing `\_`
    rem    are removed from the rebuilt file name: */
    ECHO ren "!FILE!!FEXT!" "!NAME:~1,-1!!FEXT!"
    endlocal
)

endlocal
exit /B


Efter at have testet scripterne korrekt, fjern de overordnede ECHO kommandoer for at omdøbe navnene på filer!