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