7

我有一个 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 填充,但 $SummaryOutput 在 Test1 中仍未定义。

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

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

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

4

2 回答 2

10

参考应该可以工作,你不要说你尝试它时发生了什么。这是一个例子:

测试.ps1:

Param ([ref]$OptionalOutput)

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

运行:

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

这是您可能更喜欢的替代方法。

测试.ps1:

Param ($OptionalOutput)

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

运行:

$x = New-Object PSObject
.\Test.ps1 $x
$x.Summary
于 2011-03-03T16:09:12.750 回答
1

这更接近你想要做的吗?

测试2.ps1

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

测试1.ps1

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

这:

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

是不合理的。您正在为 $SummaryLine 传递一个参数,然后立即将其替换为“发现 37 个问题”。该变量仅存在于被调用脚本正在运行的范围内。一旦该脚本完成,它就消失了。如果您想稍后使用它,您需要将其输出并保存到调用脚本中的变量中。

于 2011-03-03T03:19:36.767 回答