2011-03-03 5 views
7

하나의 PowerShell (2.0) 스크립트에서 다른 스크립트를 호출합니다. 주 출력뿐만 아니라 별도로 사용할 수있는 추가 객체 (예 : 메시지에 요약 행을 표시합니다. 를 호출하는 스크립트로매개 변수 ("참조 별"매개 변수)를 사용하여 PowerShell에서 개체를 반환 하시겠습니까?

param([String]$SummaryLine) 
$Issues = "Potentially long list of issues" 
$SummaryLine = "37 issues found" 
$Issues 

그리고 Test1.ps1 :

의 스크립트를 호출 할 것으로 Test2.ps1을하자

$MainOutput = & ".\Test2.ps1" -SummaryLine $SummaryOutput 
$MainOutput 
$SummaryOutput 

출력은 단순히 :

Potentially long list of issues 

매개 변수 $ SummaryLine은 Test2로 채워지지만 $ SummaryOutput은 Test1에서 정의되지 않은 상태로 유지됩니다.

Test2를 호출하기 전에 $ SummaryOutput을 정의하면 도움이되지 않습니다. 그것은 단지 Test2를 호출하기 전에 할당 된 값을 유지합니다.

$ SummaryOutput 및 $ SummaryLine을 [ref] 변수로 설정하려고했으나 (Test1을 호출 한 것처럼 보이는 것처럼) $ SummaryOutput.Value 속성은 Test2를 호출 한 후 $ null입니다.

PowerShell에서 매개 변수의 값을 반환 할 수 있습니까? 그렇지 않은 경우 해결 방법은 무엇입니까? Test2에서 부모 범위 변수를 직접 할당 하시겠습니까?

답변

9

Ref가 작동해야합니다. 시도했을 때 무슨 일이 일어 났는지 말하지 않습니다.

Test.ps1 :

Param ([ref]$OptionalOutput) 

"Standard output" 
$OptionalOutput.Value = "Optional Output" 

실행을 :

여기
$x = "" 
.\Test.ps1 ([ref]$x) 
$x 

당신이 더 나은 것 같아서 대안입니다 다음은 그 예이다.

Test.ps1 :

Param ($OptionalOutput) 

"Standard output" 
if ($OptionalOutput) { 
    $OptionalOutput | Add-Member NoteProperty Summary "Optional Output" 
} 

실행을 :

$x = New-Object PSObject 
.\Test.ps1 $x 
$x.Summary 
+0

거룩한 암소, [ref]가 작동합니다! 이를 시도했을 때 호출 된 스크립트에서 $ OptionalOutput.Value 대신 $ OptionalOutput을 할당했기 때문에 $ x는 호출 스크립트에서 업데이트되지 않았습니다. 두 번째 접근 방식은 어떻게됩니까? $ x가 PSObject이면 자동으로 [ref]로 전달됩니까? –

+2

두 번째 옵션이 아닌 [ref]를 사용하는 것이 좋습니다. PowerShell (.NET)에서는 개체가 참조로 전달되지만 변수의 범위가 지정됩니다. 그것은 처음에는 이해하기 어려울 수 있지만 사실입니다. – JasonMArcher

+0

@ JasonMArcher : 예, 좀 더 명확하게하기 위해 [ref]를 좋아합니다. 레. 모든 객체가 참조에 의해 전달되면 객체를 전달하는 이유는 String (.NET 참조 유형 객체)에서 작동하지 않는 이유는 무엇입니까? –

1

가까운 것을 원하십니까?

Test2.ps1

$Issues = "Potentially long list of issues" 
$SummaryLine = "37 issues found" 
$Issues 
$SummaryLine 

Test1.ps1

$MainOutput,$SummaryOutput = & ".\Test2.ps1" 
$MainOutput 
$SummaryOutput 

이 :

param([String]$SummaryLine) 
$Issues = "Potentially long list of issues" 
$SummaryLine = "37 issues found" 
$Issues 

는 비합리적입니다. $ SummaryLine에 매개 변수를 전달하고 즉시 "37 문제 발견"으로 대체합니다. 이 변수는 호출 된 스크립트가 실행되는 범위에만 존재합니다. 스크립트가 끝나면 사라집니다. 나중에 사용하려면 출력하고 호출 스크립트의 변수에 저장해야합니다.

+0

예, 기본적으로 "하는 ByRef"(출력) 매개 변수와 함수로 Test2를 치료하려고했다. 귀하의 구문은 매우 가깝습니다.=의 왼쪽에있는 여러 변수는 새로운 것이지만 나는 그것을 얻는다 고 생각합니다 : [Multi Variable Assignment] (http://get-powershell.com/2008/02/05/multi-variable-assignment-in-powershell /). 유일한 추가 기능은 Test2를 $ SummaryLine을보고 _without_를 호출 할 수 있어야한다는 것입니다. 즉, 기본값은 $ Issues 세부 사항 만 리턴하는 것입니다. 나는 $ ShowSummary 부울 param을 전달할 수 있고 $ ShowSummary = True 인 경우 $ SummaryLine 만 출력 할 수 있다고 생각합니다. –

+0

부울 대신 [스위치] 매개 변수를 사용합니다. – mjolinor

관련 문제