
どこが間違っているのか教えていただけませんか?ファイル名に以下の文字が含まれているのですが、これXXX XXX_Layer_XXX
をXXX XXX_Layer__XXX
これまでの私の試みは次のとおりです:
ren "*Layer_*.*" "*Layer__*.*"
しかし、期待通りには動作していないようです。
答え1
前回の回答では、このren
コマンドを使用しようとしましたが失敗しました。このコマンドは非常に基本的な文字列マッチングしか実行しないためです。最も重要なことは、文字列をより長い文字列に置き換えることができないことです。
他の人が同じ間違いをしないように、ここに説明を記します(答えではありません)。
コマンドが次のように記述されている場合:
ren SourceMask TargetMask
内の任意の文字により、TargetMask
ポインタが
SourceMask
1 つずつ進みます。
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%