2014-04-11 7 views
2

어떻게 문자열 변수를 강제로 확장 할 수 있습니까?Powershell : 강제 변수 확장

하나 이상의 변수 이름이있는 문자열 (템플릿)을 읽은 다음 파일을 읽은 다음 확장해야합니다. 핵심은 확장에 사용될 변수를 선언하기 전에 파일의 내용을 읽어야한다는 것입니다. 여러 가지 방법을 시도했지만 제대로 작동하지 않습니다.

$ 환경이 정의 된 후 파일을 읽는 옵션이 아닙니다. name.txt의

내용 : $ 환경 RPT-INT

#example 1 
$name = gc "c:\temp\name.txt" 
$environment = "9065DEV" 
$expanded = $ExecutionContext.InvokeCommand.ExpandString($name) 
$expanded 

#example 2 
$name = gc "c:\temp\name.txt" 
$environment = "9065DEV" 
$expanded = $expanded = Invoke-Expression "`"$template`"" 
$expanded 

#example 3 
$name = gc "c:\temp\name.txt" 
$environment = "9065DEV" 
$name = $name.Clone() 
$expanded = $ExecutionContext.InvokeCommand.ExpandString($name) 
$expanded 

는 어떤 도움에 감사드립니다.

업데이트 : 예 1이 현재 나를 위해 일하고 있습니다.

+0

안녕하세요! $ name에 얻고 자하는 변수의 이름이 들어 있다고 하시겠습니까? 그렇다면'Get-Variable -Name $ Name -ValueOnly'를 사용할 수 있습니다. 그렇지 않다면, 약간의 의사 코드로 원하는 목표를 명확히하는 것이 마음에 드십니까? –

+0

Powershell v2를 사용하고 있는데 첫 번째 예제가 저에게 효과적입니다. 어떤 버전을 사용하고 있으며 출력은 무엇입니까? – SpellingD

+0

$ name은 c : \ temp \ name.txt 파일의 내용을 포함합니다.이 문자열은 다음과 같습니다. $ environment-RPT-INT –

답변

1

귀하의 Invoke-Expression 예는 아주 가깝습니다. 그러나 $template을 사용하는 대신 $name을 사용해야합니다.

#example 2 
$name = gc 'c:\temp\name.txt'; 
$environment = '9065DEV'; 
$expanded = Invoke-Expression -Command "`"$name`""; 
$expanded; 
3

몇 가지 가능한 해결책을 찾은 것처럼 보입니다. 제 의견으로는 좀 더 똑똑하고 견고한 다른 것을 제안 할 것입니다.

텍스트 파일에 변수 이름을 요구하는 대신 형식 지정자를 사용하십시오. 예를 들어, name.txt의 내용 :

{0}-RPT-INT 

그리고 당신의 스크립트 :

$name = gc "c:\temp\name.txt" 
$environment = "9065DEV" 
$expanded = $name -f $environment 
$expanded 

이 방법을 사용하면 텍스트 파일 중 하나를 변경하여 w/o 변수의 이름을 바꿀 수 있습니다. 보너스로, 텍스트 파일이 알 수없는 출처에서 나온다면 스크립트는 코드 삽입에 취약합니다. 예를 들어, 다음 내용이 포함 된 텍스트 파일이 있다고 가정 해보십시오.

$(rm -whatif -recurse -force c:\)-RPT-INT 

ExpandString 또는 Invoke-Expression은 행복하게 해당 코드를 실행합니다.