替换Windows批处理中文件夹内的多个文件名。代码只能在一行中

替换Windows批处理中文件夹内的多个文件名。代码只能在一行中,windows,batch-file,rename,Windows,Batch File,Rename,我很难替换多个文件名。 情况将是: [Before] C:¥data¥ -HOSTNAME1_20170921_5555.zip -HOSTNAME2_20170921_5555.zip -HOSTNAME3_20170921_5555.zip [After] C:¥data¥ -HOSTNAME1_20170908_5555.zip -HOSTNAME2_20170908_5555.zip -HOSTNAME3_20170908_5555.zi

我很难替换多个文件名。 情况将是:

[Before]
C:¥data¥
    -HOSTNAME1_20170921_5555.zip
    -HOSTNAME2_20170921_5555.zip
    -HOSTNAME3_20170921_5555.zip

[After]
C:¥data¥
    -HOSTNAME1_20170908_5555.zip
    -HOSTNAME2_20170908_5555.zip
    -HOSTNAME3_20170908_5555.zip
我尝试了下面的命令,但没有得到满意的结果

RENAME C:¥data¥*20170921_5555.zip *20170908_5555.zip
不幸的是,结果是:

C:¥data¥
    -HOSTNAME1_20170920170908_5555.zip
    -HOSTNAME2_20170920170908_5555.zip
    -HOSTNAME3_20170920170908_5555.zip
谁能解决这个问题?
告诉我为什么上面的代码没有按预期工作

您特别需要一行代码,因此这里是powershell版本

get-childitem *20170921_5555.zip | foreach { rename-item $_ $_.Name.Replace("20170921_5555", "20170908_5555") }
  • 使用
    for
    迭代日期错误的文件
  • 第二个堆叠的
    用于/f
    ,用于在
    处拆分名称,以及
  • 重命名并用正确的日期替换第二个元素
使用单个命令行:

> @for %A in (*_20170921_*.zip) do @for /f "tokens=1,2* delims=_" %B in ("%A") do @echo ren "%A" "%B_20170908_%D"
ren "¥data¥-HOSTNAME1_20170921_5555.zip" "¥data¥-HOSTNAME1_20170908_5555.zip"
ren "¥data¥-HOSTNAME2_20170921_5555.zip" "¥data¥-HOSTNAME2_20170908_5555.zip"
ren "¥data¥-HOSTNAME3_20170921_5555.zip" "¥data¥-HOSTNAME3_20170908_5555.zip"
如果输出看起来正常,请删除ren命令前面的回显。
如果在批处理文件中使用,百分比符号必须加倍
%%

顺便说一句,您也可以从批处理中使用此Powershell脚本:

powershell -NoP -C "gci '*_20170921_*.zip'|rni -NewName {$_.Name -replace '_20170921_','_20170908_'} -WhatIf

如果输出看起来正常,请删除尾随的
-WhatIf

作为单行,您更愿意使用windows系统上的标准powershell。谢谢您提供的代码。但不幸的是,我的环境无法运行powershell。是否有可能将代码更改为简单的windows批处理代码?没有您要求的一行代码。else在批处理中运行相同的代码,但将call powershell放在前面。我尝试调用powershell,但未收到系统的响应。我的是Windows Server 2003。纯批处理是可能的,但您需要一行代码,这是不可能的。@fahmifahim它不起作用,为什么需要单行代码?该代码没有进行重命名的智能,因为您没有告诉它执行您认为是告诉它执行的操作。