2011-03-03 37 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