파일 이름이 "+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