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

Mar*_*rry 7 parameters powershell scope byref

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

让我们在调用脚本时使用Test2.ps1:

param([String]$SummaryLine)
$Issues = "Potentially long list of issues"
$SummaryLine = "37 issues found"
$Issues
Run Code Online (Sandbox Code Playgroud)

并且Test1.ps1作为调用它的脚本:

$MainOutput = & ".\Test2.ps1" -SummaryLine $SummaryOutput
$MainOutput
$SummaryOutput
Run Code Online (Sandbox Code Playgroud)

输出很简单:

Potentially long list of issues
Run Code Online (Sandbox Code Playgroud)

尽管参数$ SummaryLine由Test2填充,但$ SummaryOutput在Test1中仍未定义.

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

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

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

Old*_*art 9

参考应该工作,你没有说你尝试时发生了什么.这是一个例子:

Test.ps1:

Param ([ref]$OptionalOutput)

"Standard output"
$OptionalOutput.Value = "Optional Output"
Run Code Online (Sandbox Code Playgroud)

运行:

$x = ""
.\Test.ps1 ([ref]$x)
$x
Run Code Online (Sandbox Code Playgroud)

这是您可能更喜欢的替代方案.

Test.ps1:

Param ($OptionalOutput)

"Standard output"
if ($OptionalOutput) {
    $OptionalOutput | Add-Member NoteProperty Summary "Optional Output"
}
Run Code Online (Sandbox Code Playgroud)

运行:

$x = New-Object PSObject
.\Test.ps1 $x
$x.Summary
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用[ref]而不是第二个选项.在PowerShell(作为.NET)中,对象通过引用传递,但变量是作用域.起初可能很难理解,但确实如此. (2认同)