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

Как я могу это исправить?

2 ответа2

3

Правильный escape-символ в PowerShell - `(обратная галочка).

Например, вы должны написать следующее, чтобы получить строку с новой строкой:

$newline = "`n" 

Кроме того, по крайней мере, в тесте мне не нужно было избегать его. Так что просто Rename-Item "+1.txt" "+2.txt" сработало. Попытка использования -replace требовала обратной косой черты в первом аргументе, но не во втором. Так что $new = "+2" должно работать. Причина в том, что первым аргументом для -replace может быть регулярное выражение. Таким образом, термин нуждается в буквальном +, который не обрабатывается специально. Второе слагаемое состоит из буквальной строки, поэтому вам не нужно никаких специальных экранировок или подобных.

0

-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 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .