使用参数(“By Reference”参数)从PowerShell返回对象?

时间:2011-03-03 00:52:48

标签: powershell parameters scope byref

我有一个PowerShell(2.0)脚本调用另一个。我不仅要收到主要输出,还要收到另外一个我可以单独使用的对象,例如在消息中显示摘要行。

让我们将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填充,但$ TestOutput在Test1中仍未定义。

在调用Test2之前定义$ SummaryOutput没有帮助;它只保留在调用Test2之前分配的值。

我已经尝试将$ SummaryOutput和$ SummaryLine设置为[ref]变量(显然可以使用函数),但是在调用Test2之后,$ SummaryOutput.Value属性为$ null。

PowerShell中是否可以返回参数中的值?如果没有,有哪些解决方法?在Test2中直接分配父范围变量?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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个问题”。该变量仅存在于被调用脚本运行的范围内。一旦该脚本完成,它就消失了。如果以后想要使用它,则需要输出它并将其保存到调用脚本中的变量中。