使用 Windows 重命名将单下划线替换为双下划线?

使用 Windows 重命名将单下划线替换为双下划线?

有人能告诉我我哪里做错了吗?我有一些文件名包含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%

相关内容