Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用从当前名称提取的子字符串重命名Windows文件_Windows_Batch File_Cmd_Rename - Fatal编程技术网

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

如何使用从当前名称提取的子字符串重命名Windows文件,windows,batch-file,cmd,rename,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

我有一个学术论文目录,这些论文是按照以下惯例命名的:

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
未经测试

for /f "tokens=1,2,3 delims=-" %%a in ('dir /b "*.pdf"') do (
    echo ren "%%a-%%b-%%c" "%%b-%%a-%%c"
)
这只会
echo
预期的重命名命令。如果看起来正常,请删除
echo
单词。

派生形式-它可以:

@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!
    )
)

如果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

这里有一种可靠的方法可以实现您的要求,即使作者部分本身包含
-
。标题部分甚至可能包含
,但作者部分不能包含。这就是代码:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u FILES=.\*-(??)-*.pdf”&rem//(基本模式匹配正确的文件)
设置“_REGEX=^[^()][^()]*-([0123456789][0123456789][0123456789][0123456789][0123456789])-.\.pdf$”^
&rem/(精确筛选以排除违反所需模式的文件)
如果未定义_regexset“_REGEX=.*”&rem//(避免空过滤器出现问题)
rem//循环浏览所有匹配的文件:
对于/F“eol=:令牌=1,2,*delims=()”%%F in('
目录/B/A:-D“%\u文件%”^ findstr/I/R/C:“%\u REGEX%”
""做"(
rem//存储提取的文件名部分:
设置“左=%%F”&设置“年=%%G”&设置“剩余=%%H”
setlocal EnableDelayedExpansion
rem//重新组合名称并重命名文件:
任回声“!左!(!年!)!休息!”(!年!)-!左!!休息:*-=!”
端部
)
端部
退出/B

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

是否使用批处理要求?如果没有,我更喜欢一些脚本语言(我最喜欢的是Python)。将文件名按“-”拆分为字段,然后对字段进行重新排序。此外,我建议从名称中删除()——使用文件名中的名称不是很好的做法谢谢你的建议。使用批处理文件不是一项要求,但我的Python技能很糟糕,比DOS命令语言糟糕得多。不过,我将试一试,因为它似乎只需要导入操作系统,并使用预构建的方法来标记字段并重新排序。谢谢,当我在delims之间留出一个空格时,这就行了=-“和上面的%%a。当有连字符的作者姓名时,它只是简单地交换姓名,但我通过将“Smith&Jones”替换为“Smith&Jones”@mhla-Thank-fixed解决了这个问题。如果有包含
-
的名称,您可以尝试用括号分割名称…谢谢,我在运行此操作时收到一个错误(“此处不应出现”),我仍在尝试找出导致错误的原因。我再次尝试,结果很好。复制样本时可能丢失了什么?“for”的帮助告诉了“/F”-在我的系统上,如果我使用“/F”或“/F”,似乎没有什么区别,但可能是你的?我再试了一次,现在它工作了。是我在一个非标准文本编辑器中剪切和粘贴,把and for循环搞砸了。非常感谢。谢谢,我在运行此命令时出错(“命令的语法不正确”),我正在试图找出发生这种情况的原因。@mhla我在这里成功地测试了它。你复制粘贴了源代码了吗?我终于弄明白了。非常感谢。它是复制和粘贴到非ISO文本编辑器中的过程