почему Powershell сообщает мне, что мой файл представляет собой путь, когда я пытаюсь переименовать его?

почему Powershell сообщает мне, что мой файл представляет собой путь, когда я пытаюсь переименовать его?

У меня есть файл с именем «+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 

Связанный контент