
誰能告訴我我哪裡出了問題?我有一些文件名包含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%