por que o Powershell me diz que meu arquivo representa um caminho quando tento renomeá-lo?

por que o Powershell me diz que meu arquivo representa um caminho quando tento renomeá-lo?

Tenho um nome de arquivo "+1.txt" que desejo renomear para "+2.txt"

Meu script Powershell é:

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

Isso retorna:

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

Como posso corrigir isso?

Responder1

O caractere de escape correto no PowerShell é `(o crase).

Por exemplo, você escreveria o seguinte para obter uma string com uma nova linha:

$newline = "`n" 

Além disso, pelo menos em uma prova, não precisei escapar. Então simplesmente Rename-Item "+1.txt" "+2.txt"funcionou. Uma tentativa de usar -replaceexigia a barra invertida no primeiro argumento, mas não no segundo. Então $new = "+2"deveria funcionar. A razão é que o primeiro argumento para -replacepode ser uma expressão regular. Portanto, o termo precisa de um literal + que não é tratado de maneira especial. O segundo termo é tratado como uma string literal, então você não precisa de nenhum escape especial ou similar.

Responder2

-replaceusa expressões regulares, mas você não precisa escapar manualmente dos caracteres.
Get-ChildItem itera todos os itens no caminho atual, você deve especificar um nome

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

ou use um padrão onde -matchapenas.

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

informação relacionada