有人能告诉我我哪里做错了吗?我有一些文件名包含XXX XXX_Layer_XXX
,我正尝试将其替换为XXX XXX_Layer__XXX
我迄今为止的尝试是:
ren "*Layer_*.*" "*Layer__*.*"
但这似乎没有像预期的那样有效!
答案1
我之前的回答尝试使用该ren
命令但失败了,因为该命令仅执行非常基本的字符串匹配。最重要的是,它无法用更长的字符串替换字符串。
为了防止其他人犯同样的错误,这里有一个解释(而不是答案)。
如果命令写成:
ren SourceMask TargetMask
那么 中的任何字符TargetMask
都会导致指针进入
SourceMask
前进一个位置。
1234.567
因此,如果我们通过以下命令重命名文件:
ren *2*.* *2X*.*
结果将是12X4.567
。它将不是是天真地期望的
12X34.567
。
原因是TargetMask
这里是这样处理的:
*2 - matches up to and including 2, adding to target : 12
X - matches itself AND advances one position so skipping 3, adding to target : X
*. - matches up to and including the point, adding to target : 4.
* - matches the extension part, adding to target : 567
结论:ren
替换长度不等的字符串时应避免使用该命令。
ren
这篇文章非常完整地描述了该工作方式
Windows RENAME 命令如何解释通配符?。
答案2
在 PowerShell 中应该更容易
Get-ChildItem *Layer_* | Rename-Item -NewName { $_.Name -creplace '_Layer_', '_Layer__' } -WhatIf
别名版本:
ls *Layer_* | ren -Ne { $_.Name -creplace '_Layer_', '_Layer__' } -wi
确认新名称正确后,只需删除-WhatIf
/-wi
即可进行真正的重命名
在 cmd 中,rename
如果命令发现目标,则会进行贪婪替换,*
因此您的解决方案将不起作用。请参阅Windows RENAME 命令如何解释通配符?。您需要自己替换字符串。类似这样的
@echo off
setlocal enabledelayedexpansion
for %%d in (*_Layer_*) do (
set "name=%%d"
echo ren "!name!" "!name:_Layer_=_Layer__!"
)
替换的是这部分!name:_Layer_=_Layer__!
。语法是%variablename:text_to_find=text_to_replace%