Ich habe einen Dateinamen „+1.txt“, den ich in „+2.txt“ umbenennen möchte.
Mein Powershell-Skript lautet:
$old = "\+1"
$new = "\+2"
Get-ChildItem | Rename-Item -NewName {$_.name -replace $old, $new }
Dies gibt Folgendes zurück:
powershell : Rename-Item : Cannot rename the specified target, because it represents a path
Wie kann ich das korrigieren?
Antwort1
Das richtige Escape-Zeichen in PowerShell ist ` (der Backtick).
Um einen String mit einem Zeilenumbruch zu erhalten, würden Sie beispielsweise Folgendes schreiben:
$newline = "`n"
Außerdem musste ich es zumindest in einem Test nicht maskieren. Hat also einfach Rename-Item "+1.txt" "+2.txt"
funktioniert. Ein Versuch mit -replace
erforderte den Backslash im ersten Argument, aber nicht im zweiten. $new = "+2"
Sollte also funktionieren. Der Grund ist, dass das erste Argument für -replace
ein regulärer Ausdruck sein könnte. Der Begriff benötigt also ein wörtliches +, das nicht speziell behandelt wird. Der zweite Begriff wird als wörtlicher String behandelt, sodass Sie kein spezielles Maskieren oder Ähnliches benötigen.
Antwort2
-replace
verwendet reguläre Ausdrücke, aber Sie müssen Zeichen nicht manuell maskieren.
Get-ChildItem iteriert alle Elemente im aktuellen Pfad, Sie müssen einen Namen angeben
$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem $old -file|
Rename-Item -NewName {$_.FullName -replace [regex]::escape($old), $new }
oder verwenden Sie ein -match
Nur-Wo-Muster.
$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem |
where Name -match [regex]::escape($old)|
Rename-Item -NewName $new