Windows の名前変更を使用して、単一のアンダースコアを二重のアンダースコアに置き換えますか?

Windows の名前変更を使用して、単一のアンダースコアを二重のアンダースコアに置き換えますか?

どこが間違っているのか教えていただけませんか?ファイル名に以下の文字が含まれているのですが、これXXX XXX_Layer_XXXXXX XXX_Layer__XXX

これまでの私の試みは次のとおりです:

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

しかし、期待通りには動作していないようです。

答え1

前回の回答では、このrenコマンドを使用しようとしましたが失敗しました。このコマンドは非常に基本的な文字列マッチングしか実行しないためです。最も重要なことは、文字列をより長い文字列に置き換えることができないことです。

他の人が同じ間違いをしないように、ここに説明を記します(答えではありません)。

コマンドが次のように記述されている場合:

ren SourceMask TargetMask

内の任意の文字により、TargetMaskポインタが SourceMask1 つずつ進みます。

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%

関連情報