如何使用当前名称中提取的子字符串重命名Windows文件

时间:2017-02-15 15:09:08

标签: windows batch-file cmd rename

我有一份学术论文目录,使用以下惯例命名:

Author1-(Year)-Title.pdf

例如,

Jones-(2011)-XXX.pdf
Smith-(2002)-YYY.pdf
Johnson-(2015)-ZZZ.pdf

我想将它们重命名为

(2011)-Jones-XXX.pdf
(2002)-Smith-YYY.pdf
(2015)-Johnson-ZZZ.pdf

即,从文件名中提取年份并将其放在前面。

我尝试了以下代码,但无效

    Setlocal enabledelayedexpansion

    Set "Year=2013"
    Set "Replace="""

    For %%a in (*.pdf) Do (
        Set "NewName=(%year%)-%%~a"
        Ren "%%a" "%NewName%-File:%Year%=%Replace%!" 
    )

    Pause&Exit

4 个答案:

答案 0 :(得分:1)

如果XXX还包含连字符,我建议使用tokens=1,2*来停止解析文件名的其余部分。
我也会删除括号,当年份是第一名时,没有必要进一步强调它。

@Echo off
for /f "tokens=1-2* delims=-()" %%A in (
  'Dir  /b "*-(*)-*.pdf"'
) do Ren "%%A-(%%B)-%%C" "%%B-%%A-%%C"

示例输出

> dir /b
2002-Smith-YYY.pdf
2011-Jones-XXX.pdf
2015-Johnson-ZZZ.pdf

答案 1 :(得分:0)

未经测试

for /f "tokens=1,2,3 delims=-" %%a in ('dir /b "*.pdf"') do (
    echo ren "%%a-%%b-%%c" "%%b-%%a-%%c"
)

这只会echo预期的重命名命令。如果看起来没问题,请删除echo字。

答案 2 :(得分:0)

派生形式this SO article - 它有效:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION

FOR %%x IN (*.pdf) DO (
    FOR /f "tokens=1-3 delims=-" %%a IN ("%%~x") DO (
        SET "Author=%%a"
        SET "Year=%%b"
        SET "Title=%%c"

        ren %%x !Year!-!Author!-!Title!
    )
)

答案 3 :(得分:0)

即使作者部分自己包含-,这也是一种可靠的方式来满足您的要求。标题部分甚至可能包含(),但作者部分不得包含@echo off setlocal EnableExtensions DisableDelayedExpansion rem // Define constants here: set "_FILES=.\*-(????)-*.pdf" & rem // (basic pattern to match correct files) set "_REGEX=^[^()][^()]*-([0123456789][0123456789][0123456789][0123456789])-.*\.pdf$" ^ & rem // (precise filter to exclude files violating the demanded pattern) if not defined _REGEX set "_REGEX=.*" & rem // (avoid trouble with empty filter) rem // Loop through all matching files: for /F "eol=: tokens=1,2,* delims=()" %%F in (' dir /B /A:-D "%_FILES%" ^| findstr /I /R /C:"%_REGEX%" ') do ( rem // Store the extracted file name parts: set "LEFT=%%F" & set "YEAR=%%G" & set "REST=%%H" setlocal EnableDelayedExpansion rem // Reassemble the name and rename the file: ECHO ren "!LEFT!(!YEAR!)!REST!" "(!YEAR!)-!LEFT!!REST:*-=!" endlocal ) endlocal exit /B ECHO。所以这是代码:

{{1}}

验证输出正确后,删除大写{{1}}命令以实际重命名文件。