warum sagt mir Powershell, dass meine Datei einen Pfad darstellt, wenn ich versuche, sie umzubenennen?

warum sagt mir Powershell, dass meine Datei einen Pfad darstellt, wenn ich versuche, sie umzubenennen?

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 -replaceerforderte den Backslash im ersten Argument, aber nicht im zweiten. $new = "+2"Sollte also funktionieren. Der Grund ist, dass das erste Argument für -replaceein 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

-replaceverwendet 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 -matchNur-Wo-Muster.

$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem | 
  where Name -match [regex]::escape($old)|
    Rename-Item -NewName $new 

verwandte Informationen