programing

PowerShell 경로에서 달러 기호 이스케이프가 작동하지 않음

newsource 2023. 8. 18. 22:42

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