使用 Windows 重新命名將單一底線替換為雙下劃線?

使用 Windows 重新命名將單一底線替換為雙下劃線?

誰能告訴我我哪裡出了問題?我有一些文件名包含XXX XXX_Layer_XXX並且我正在嘗試替換為XXX XXX_Layer__XXX

到目前為止我的嘗試是:

ren  "*Layer_*.*"  "*Layer__*.*"

但這似乎並沒有達到預期的效果!

答案1

我之前的答案嘗試使用該ren命令但失敗了,因為該命令只進行非常原始的字串匹配。最重要的是,它不能用更長的字串替換字串。

為了防止其他人犯下同樣的錯誤,這裡給出一個解釋(不是答案)。

如果命令寫成:

ren SourceMask TargetMask

那麼 in 中的任何字元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如果命令看到 a ,則會在目標中執行貪婪替換,*因此您的解決方案將不起作用。看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%

相關內容