У меня есть файл с именем «+1.txt», который я хочу переименовать в «+2.txt».
Мой скрипт Powershell:
$old = "\+1"
$new = "\+2"
Get-ChildItem | Rename-Item -NewName {$_.name -replace $old, $new }
Это возвращает:
powershell : Rename-Item : Cannot rename the specified target, because it represents a path
Как это исправить?
решение1
Правильный экранирующий символ в PowerShell — ` (обратная кавычка).
Например, чтобы получить строку с новой строкой, нужно написать следующее:
$newline = "`n"
Кроме того, по крайней мере в тесте мне не нужно было экранировать его. Так что просто Rename-Item "+1.txt" "+2.txt"
сработало. Попытка использования -replace
потребовала обратную косую черту в первом аргументе, но не во втором. Так что $new = "+2"
должно сработать. Причина в том, что первый аргумент for -replace
может быть регулярным выражением. Поэтому для члена нужен литерал +, который не обрабатывается специально. Второй член обрабатывается как литеральная строка, так что вам не нужно никакого специального экранирования или чего-то подобного.
решение2
-replace
использует регулярные выражения, но вам не нужно вручную экранировать символы.
Get-ChildItem перебирает все элементы в текущем пути, вам нужно указать имя
$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem $old -file|
Rename-Item -NewName {$_.FullName -replace [regex]::escape($old), $new }
или используйте шаблон «где -match
только».
$old = "+1.txt"
$new = "+2.txt"
Get-ChildItem |
where Name -match [regex]::escape($old)|
Rename-Item -NewName $new