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"작동해야합니다. 그 이유는 첫 번째 인수가 -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 

관련 정보