簡體   English   中英

Windows重命名文件的批處理腳本

[英]windows batch script for renaming files

我在Windows文件夾中有很多文件。 這些文件名也包含很多下划線。 例如:

 ad_iod_errr_opp12.txt ghff_jjk56.txt opr_sdr_ot_wrr_12ee.txt 

我想重命名這些文件,以便刪除最后一個下划線及其后面的所有內容,並按以下方式重命名文件:

 ad_iod_errr.txt ghff.txt opr_sdr_ot_wrr.txt 

注意:下划線的數量有所不同。 某些文件名可能只有一個下划線,而其他文件名可能最多有8個下划線。 我正在尋找可以解決問題的Windows批處理腳本,而不是PowerShell命令。

考慮到文件名中只有一個下划線,這是我當前正在使用的代碼來重命名文件:

@ECHO OFF 
SETLOCAL 
cd C:\Users\ambika.narayan.rao\JenkinsWorkspace 
SET "fname=*.txt" 
FOR %%i IN ("%fname%") DO FOR /f "delims=_" %%j IN ("%%i") DO ren "%%~i" "%%~j%%~xi" 
GOTO :EOF
@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

您需要更改sourcedir的設置以適合您的情況。

所需REN命令僅僅ECHO編用於測試目的。 驗證命令正確無誤后 ,將ECHO(REN更改為REN即可實際重命名文件。

對與掩碼匹配的所有文件名執行目錄掃描。 找到的每個名稱都使用延遲擴展,將名稱分配給filename ,然后將每個_替換為空格 _

使用簡單的for來將newname分配給_string刪除_string的原始文件名(不替換任何內容 ),然后使用%%~xa _string重新添加擴展名。 分配給%%b的最后一個字符串將是_laststring.ext ,因此分配給newname的值將滿足處理要求,因此重命名該文件。

這是一個修改后的腳本,我在另一個答案中發布了該腳本,該腳本依靠一個不錯的技巧刪除由某個字符分隔的字符串的最后部分-在這種情況下為下划線_ 請注意,如果任何文件包含感嘆號,此操作將失敗! 以他們的名字。 所以這是代碼:

@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

為了也能夠正確處理帶有感嘆號的文件名,這是另一種方法:

@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

成功測試腳本后,請刪除大寫的ECHO命令以實際重命名任何文件!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM