Mithilfe der Windows-Umbenennung einen einzelnen Unterstrich durch einen doppelten ersetzen?

Mithilfe der Windows-Umbenennung einen einzelnen Unterstrich durch einen doppelten ersetzen?

Kann mir jemand sagen, was ich hier falsch mache? Ich habe einige Dateinamen, die enthalten XXX XXX_Layer_XXXund versuche, sie zu ersetzen durchXXX XXX_Layer__XXX

Mein bisheriger Versuch war:

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

Aber das scheint nicht wie erwartet zu funktionieren!

Antwort1

Meine vorherige Antwort versuchte, den Befehl zu verwenden, renund schlug fehl, da dieser Befehl nur eine sehr primitive Zeichenfolgenübereinstimmung durchführt. Vor allem kann er eine Zeichenfolge nicht durch eine längere ersetzen.

Um zu verhindern, dass andere denselben Fehler machen, finden Sie hier eine Erklärung (keine Antwort).

Wenn der Befehl wie folgt geschrieben wird:

ren SourceMask TargetMask

dann bewirkt jedes Zeichen in, TargetMaskdass der Zeiger in SourceMaskum eine Position weitergeht.

1234.567Wenn wir die Datei also mit dem folgenden Befehl umbenennen :

ren *2*.* *2X*.*

Das Ergebnis wird sein 12X4.567. Es wirdnichtsei das naiv Erwartete 12X34.567.

Der Grund ist, dass TargetMaskes hier folgendermaßen gehandhabt wird:

*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

Fazit: renBeim Ersetzen von Strings ungleicher Länge sollte der Befehl vermieden werden.

Die Funktionsweise renwird im Beitrag sehr ausführlich beschrieben.
Wie interpretiert der Windows-Befehl RENAME Platzhalter?.

Antwort2

In PowerShell sollte es viel einfacher sein

Get-ChildItem *Layer_* | Rename-Item -NewName { $_.Name -creplace '_Layer_', '_Layer__' } -WhatIf

Alias-Version:

ls *Layer_* | ren -Ne { $_.Name -creplace '_Layer_', '_Layer__' } -wi

Nachdem Sie bestätigt haben, dass die neuen Namen korrekt sind, entfernen Sie einfach -WhatIf/ -wi, um eine echte Umbenennung durchzuführen

In cmd renameführt der Befehl einen gierigen Ersatz im Ziel aus, wenn er ein sieht, *sodass Ihre Lösung nicht funktioniert. SieheWie interpretiert der Windows-Befehl RENAME Platzhalter?. Sie müssen die Saite selbst ersetzen. So etwas wie das hier

@echo off
setlocal enabledelayedexpansion

for %%d in (*_Layer_*) do (
    set "name=%%d"
    echo ren "!name!" "!name:_Layer_=_Layer__!"
)

Der Ersatz ist dieser Teil !name:_Layer_=_Layer__!. Die Syntax ist%variablename:text_to_find=text_to_replace%

verwandte Informationen