2011-09-26 8 views
0

다른 매개 변수 값이 포함 된 매개 변수를 함수에 전달할 때 PowerShell 런타임에서 표현식 모드로 문자열을 구문 분석하도록하는 방법을 알아 내려고합니다. 예를 들어 첫 번째 매개 변수의 값을 사용하여 두 번째 매개 변수가있는 함수에 두 개의 매개 변수를 전달하려고합니다. 파서가 표현 모드에서 두 번째 매개 변수 값을 평가해야하지만 출력이 첫 번째 매개 변수의 값을 해석하지 않는 것 같습니다.PowerShell 함수 매개 변수 값 매개 변수 사이의 해결

PowerShell을 명령 # 1 본 실시 예는 원하는 작동 출력

& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $(2 + 2)" 

2 + 2 주위 하위 표현식을 사용하는 경우 명령 식 모드에서 평가 증명

foo 
Test 1 value: 4 

PowerShell을 명령 # 2 이제 매개 변수 2 ($ test2)가 매개 변수 1 ($ test1)의 값을 참조하도록 동일한 것을 시도하면 표현식이 평가되지 않았거나 적어도 $ test1의 값이 공백이거나 null입니다. .

& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $($test1)" 

출력 나는 그것을 "foo는"을 $ TEST1 매개 변수에 전달 된 값이어야 생각할 때 테스트 한 값이 비어 얼마나

foo 
Test 1 value: 

참고. PowerShell 함수에서 매개 변수 범위에 대해 무엇을 놓치고 있습니까? $ test1 값을 $ test2 값으로 전달 된 표현식에서 참조 할 수없는 이유는 무엇입니까? 이 일을 더 우아한 방법이 있습니까?

답변

0

답변 해 주셔서 감사 드리며 몇 가지 사항을 명확하게 설명해줍니다. 궁극적으로 데이터베이스에서 스크립트에 매개 변수를 전달하려고합니다. 매개 변수 값은 다른 PowerShell 매개 변수에 대한 참조를 포함하며 스크립트가 실행될 때까지 확인할 수 없습니다. 저는 IIS에서 PowerShell 실행 영역을 실행 중이므로 파서가 표준 문자를 사용하여 표현식을 평가하도록하는 방법을 파악할 수 없었습니다.

아아아, PowerShell에서 $ ExecutionContext.InvokeCommand.ExpandString() 함수가 필요한 것을 정확히 찾아 냈습니다. 이 함수는 실제로 커버 아래에 ""문자로 실행됩니다 (http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-12-command-discovery-and-scriptblocks.aspx#executioncontext).

그것은 내가 원하는 것을 할 약간의 추가 작업이 필요하지만 스크립트의 값을 해결하기 위해 다음과 같은 패턴을 사용 할 수 있었다. 그러면 파서가 표현 모드에서 $ test2를 재평가하고 변수 하위를 수행하여 적절한 변수 값을 포함하는 문자열을 생성합니다.

$test2 = $ExecutionContext.InvokeCommand.ExpandString($test2) 

의견과 안내에 다시 한 번 감사드립니다!

+0

좋은 결과를 얻었습니다. 이후에 $ test2를 실행하여 $ test를 실행하고 계신 것 같군요. btw, 대답을 표시해야 할 경우 왼쪽 눈금이 그 일을합니다. :-) – Matt

+0

나중에 실제로 & $ test2 구문을 사용하여 명령을 실행하지는 않습니다. 대신 변수 값은 구문 분석되어 원래 문자열에서 대체되어 스크립트에서 더 아래쪽으로 사용됩니다. 핵심은 파서가 PowerShell에서 ExpandString 함수를 사용하여 변수를 다시 평가하도록합니다. – JPC

1

"표현식"이 스크립트 블록 외부에서 평가되기 때문에 스크립트 블록에 인수를 전달하기도 전에 발생합니다.

foo 
Test 1 value: 4 

해결 방법 :

$test1 = 4 
& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $($test1)" 

출력 줄 것입니다 :

& { param($test1,$test2); $test1; & $test2 } "foo" {"Test 1 value: $test1"} 

을하지만 실제 상황에서 가정, 당신이 싶지 않을 것이다 이

그래서 뭔가처럼

작업하고있는 스크립트 블록 (또는 함수 등)을 변경하십시오.

$test1 = "foo" 
$test2 = "Test 1 value: $test1" 
& { param($test1,$test2); $test1; $test2 } $test1 $test2 
+0

두 번째 매개 변수 값 주위의 스크립트 블록을 사용하여 문제를 해결해 주셔서 감사합니다. 그러면 문제가 해결되고 표현 모드 구문 분석이 강제 적용됩니다. – JPC

0

스키마 \의 혀짤배기 생각 나게 : 당신이 정말로 원하는 것은이 같이

나는 또한이 상황에 대한 필요성을 질문 것입니다! 해당 언어로 함수를 매개 변수로 전달할 수 있습니다 - PS에서 스크립트 블록을 매개 변수로 전달할 수 있는지는 잘 모르겠습니다.

어쨌든 변수 이름을 참조하는 것이 중요합니까?

그렇지 않으면 당신은 당신이 이런 식으로 뭔가 할 수있는 최초의 변수 (또는 당신의 선택의 변수)를 참조 할 :

& { $args[0]; $args[1]; "Value of arg #$($args[1]): $($args[$($args[1])])"} "foo" "0" 
다른 여러 변수와

작품 :

& { $args[0]; $args[1]; "Value of arg #$($args[1]): $($args[$($args[1])])"} "foo" "3" 23 24 25 26 
+0

args 컬렉션에 대한 아이디어에 감사드립니다. 이름은 스크립트에서 매개 변수 이름에 의한 내부 변수 참조가 있기 때문에 중요합니다. 기본적으로 다른 매개 변수에서 하나의 매개 변수의 값을 사용하여 매개 변수를 상호 작용할 수 있습니다. – JPC