2011-03-03 55 views
7

我有一個PowerShell(2.0)腳本調用另一個。我不僅希望收到主要的輸出,而且要另外收到我可以單獨使用的對象,例如在消息中顯示彙總行。使用參數(「By Reference」參數)從PowerShell返回對象?

讓我們Test2.ps1爲被調用的腳本:

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

而且Test1.ps1因爲調用它的腳本:

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

輸出很簡單:

Potentially long list of issues 

雖然參數$ SummaryLine由Test2填充,但$ SummaryOutput在Test1中保持未定義。

在調用Test2之前定義$ SummaryOutput並沒有幫助;它只是保留調用Test2之前分配的值。

我試着設置$ SummaryOutput和$ SummaryLine作爲[ref]變量(正如你可以用函數做的那樣),但是在調用Test2之後$ SummaryOutput.Value屬性是$ null。

是否有可能在PowerShell中返回參數中的值?如果沒有,解決方法是什麼?在Test2中直接分配一個父範圍變量?

回答

9

編號應該工作,你不會說當你嘗試時發生了什麼。這裏有一個例子:

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而不是$ OptionalOutput.Value,所以$ x在調用腳本中沒有更新。那麼你的第二種方法是怎麼回事?如果$ x是一個PSObject,它會自動作爲[ref]傳遞? – 2011-03-03 19:38:04

+2

我會建議使用[ref]而不是第二個選項。在PowerShell(如.NET)中,對象按引用傳遞,但變量是作用域的。起初可能很難理解,但這是事實。 – JasonMArcher 2011-03-03 19:58:59

+0

@JasonMArcher:是的,我喜歡[ref]更明確。回覆。傳遞對象,如果所有的對象都是通過引用傳遞的,爲什麼不能用於String(這是一個.NET Reference Type對象)? – 2011-03-03 20:25:52

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

是的,我是想從根本上治療的Test2作爲一個 「的ByRef」(輸出)參數的函數。你的語法非常接近。=左側的多個變量對我來說是新的,但我想我明白了:[多變量賦值](http://get-powershell.com/2008/02/05/multi-variable-assignment-in-powershell /)。我想要的唯一附加「功能」是能夠調用Test2 _而不會看到$ SummaryLine。換句話說,默認情況下只返回$ Issues細節。我想這是因爲我可以傳遞$ ShowSummary布爾參數,並且只輸出$ SummaryLine,如果$ ShowSummary = True。 – 2011-03-03 04:24:35

+0

我會使用[開關]參數,而不是布爾值。 – mjolinor 2011-03-03 12:14:23