¿Por qué Powershell me dice que mi archivo representa una ruta cuando intento cambiarle el nombre?

¿Por qué Powershell me dice que mi archivo representa una ruta cuando intento cambiarle el nombre?

Tengo un nombre de archivo "+1.txt" que deseo cambiar a "+2.txt"

Mi script de Powershell es:

$old = "\+1"
$new = "\+2"
Get-ChildItem | Rename-Item -NewName {$_.name -replace $old, $new }

Esto devuelve:

powershell : Rename-Item : Cannot rename the specified target, because it represents a path

¿Cómo puedo corregir esto?

Respuesta1

El carácter de escape correcto en PowerShell es ` (la marca de verificación).

Por ejemplo, escribirías lo siguiente para obtener una cadena con una nueva línea:

$newline = "`n" 

Además, al menos en una prueba, no necesitaba escapar de él. Así que Rename-Item "+1.txt" "+2.txt"funcionó. Un intento de uso -replacerequería la barra invertida en el primer argumento, pero no en el segundo. Entonces $new = "+2"debería funcionar. La razón es que el primer argumento -replacepodría ser una expresión regular. Entonces el término necesita un + literal que no se maneje de manera especial. El segundo término se maneja como una cadena literal, por lo que no necesita ningún escape especial o similar.

Respuesta2

-replaceutiliza expresiones regulares, pero no es necesario escapar manualmente de los caracteres.
Get-ChildItem itera todos los elementos en la ruta actual, debes especificar un nombre

$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem $old -file| 
  Rename-Item -NewName {$_.FullName -replace [regex]::escape($old), $new }

o use un -matchpatrón de dónde solo.

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

información relacionada