PowerShell 경로에서 달러 기호 이스케이프가 작동하지 않음
왜 안 되는 거지?
$drvrInstFilePath = "$sharePath\$imageName\ISO`$OEM$`$1\RPKTools\RPKDriverInst.bat"
echo $drvrInstFilePath
$drvrInstContent = Get-Content -LiteralPath "$sharePath\$imageName\ISO`$OEM$`$1\RPKTools\RPKDriverInst.bat" | Out-String
에코는 올바른 경로를 보여주지만 Get-Content 명령은 $oem 및 $1을 이스케이프된 문자열로 확장합니다. 왜죠?
달러 표시를 피해 다니는 대신, 단일 따옴표를 사용합니다.'
큰따옴표 대신에"
PowerShell 확장을 방지합니다.$
변수로 변환합니다.이렇게.
$p = "C:\temp\Share\ISO$OEM$"
# Output
C:\temp\Share\ISO$
$p = 'C:\temp\Share\ISO$OEM$'
# Output
C:\temp\Share\ISO$OEM$
변수를 사용하여 경로를 생성해야 하는 경우에는Join-Path
이렇게.
$s = "Share"
join-path "C:\temp\$s" '\ISO$OEM$'
# Output
C:\temp\Share\ISO$OEM$
실제로 체크 표시를 사용하여 탈출할 수 있습니다.$
이와 같이:
`$
예:
$number = 5
Write-Host "`$${number}"
# Output: $5
백티크 하나로 큰따옴표를 사용했습니다.이것은 잘못된 조합입니다.사실 어떤 경우에도 백티크 하나로 충분한지 잘 모르겠습니다.PowerShell에서 달러 기호($)를 이스케이프하기 위한 성공적인 옵션은 백슬래시-백틱 조합("\'$find")이 있는 큰따옴표를 사용하거나, 대신 간단한 백슬래시("\$find")가 있는 작은따옴표를 사용하는 것입니다.[단, 함수 호출 매개변수에 대한 마지막 예외에 유의하십시오.]예제는 아래를 참조하십시오.
또한 구별에 익숙하지 않은 사람들에게는 이러한 탈출에서 백틱 문자(')와 단일 따옴표 문자(')를 혼동하지 않는 것이 중요합니다.
[SUCCESS] 백슬래시-백티크가 이스케이프인 컨테이너로 큰따옴표를 사용합니다.
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"}
What is (New)?
PS C:\Temp>
[FAIL] 백슬래시-apostrope를 이스케이프로 사용하는 컨테이너로 큰따옴표를 사용합니다.
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"}
What is $old?
PS C:\Temp>
[SUCCESS] 컨테이너로서의 단일 따옴표, 단순 백슬래시를 이스케이프로 사용:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"}
What is (New)?
PS C:\Temp>
[FAIL] 백슬래시-백티크를 이스케이프로 지정한 컨테이너로 단일 따옴표:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"}
What is $old?
PS C:\Temp>
전반적으로 가장 쉬운 옵션은 단일 따옴표를 컨테이너로 사용하고 단일 백슬래시를 이스케이프로 사용하는 것입니다.'\$old'
업데이트 : 위의 내용이 충분히 혼동되지 않은 것처럼 명령어 대신 함수 호출을 사용할 경우, 탈출 없이 단일 따옴표가 필요합니다.함수 호출 매개 변수에 이스케이프를 사용하려고 하면 작동하지 않습니다.
[FAIL] 함수 매개변수에서 이스케이프 사용:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_.ToString().Replace('\$old', "(New)");}
What is $old?
PS C:\Temp>
[SUCCESS] 함수 매개변수에서 이스케이프 없이 일반 따옴표 사용:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_.ToString().Replace('$old', "(New)");}
What is (New)?
PS C:\Temp>
내 경우엔 좀 탈출해야 했어요$
문자열에 사용되지만 변수인 다른 문자열에는 사용되지 않습니다.
예를 들어, 내 SSRS 인스턴스 이름은$
표시:표시:
[보고서 서버$SSRS]
$ 기호를 피하기 위해 저는 작은 따옴표를 사용합니다.그렇지 않으면 사용합니다.-join
변수를 실제 $ 기호가 포함된 문자열과 연결하는 문입니다.
$sql = -join('ALTER DATABASE [ReportServer$', $instanceName,'TempDB]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
USE [master]
RESTORE DATABASE [ReportServer$', $instanceName,'TempDB] FROM DISK = N''C:\temp\ReportServerTempDB.BAK'' WITH FILE = 1,
MOVE N''ReportServerTempDB'' TO N''', $sqlDataDrive + "\data_" + $instanceName, '\ReportServer$', $instanceName,'TempDB.mdf'',
MOVE N''ReportServerTempDB_log'' TO N''', $sqlLogDrive + "\log_" + $instanceName, '\ReportServer$', $instanceName,'_TempDBlog.LDF'', NOUNLOAD, REPLACE, RECOVERY, STATS = 5
GO
ALTER DATABASE [ReportServer$', $instanceName,'TempDB]
SET MULTI_USER;
GO
')
언급URL : https://stackoverflow.com/questions/17452401/escaping-dollar-signs-in-powershell-path-is-not-working
'programing' 카테고리의 다른 글
파서 오류: '_Default'는 클래스 'System'을 확장하지 않으므로 여기서 허용되지 않습니다.웹.UI.페이지' & 마스터형식 선언 (0) | 2023.08.18 |
---|---|
아이폰 코어 데이터 "프로덕션" 오류 처리 (0) | 2023.08.18 |
PIL 이미지를 바이트 배열로 변환하시겠습니까? (0) | 2023.08.18 |
탭을 사용하여 텍스트 영역 들여쓰기 (0) | 2023.08.18 |
$.ajax - dataType (0) | 2023.08.18 |