
Kann mir jemand sagen, was ich hier falsch mache? Ich habe einige Dateinamen, die enthalten XXX XXX_Layer_XXX
und 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, ren
und 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, TargetMask
dass der Zeiger in
SourceMask
um eine Position weitergeht.
1234.567
Wenn 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 TargetMask
es 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: ren
Beim Ersetzen von Strings ungleicher Länge sollte der Befehl vermieden werden.
Die Funktionsweise ren
wird 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 rename
fü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%