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 -replace
exigia 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 -replace
pode 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
-replace
usa 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 -match
apenas.
$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem |
where Name -match [regex]::escape($old)|
Rename-Item -NewName $new