是否使用参数(“按引用”参数)从PowerShell返回对象?

是否使用参数(“按引用”参数)从PowerShell返回对象?,powershell,parameters,scope,byref,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 = & ".\Tes

我有一个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中直接分配一个父范围变量?

这更接近您想要做的事情吗

Test2.ps1

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

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


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

Ref应该可以工作,您不需要说明尝试时发生了什么。以下是一个例子:

测试1.ps1:

Param ([ref]$OptionalOutput)

"Standard output"
$OptionalOutput.Value = "Optional Output"
Param ($OptionalOutput)

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

$x = ""
.\Test.ps1 ([ref]$x)
$x
$x = New-Object PSObject
.\Test.ps1 $x
$x.Summary
这里有一个你可能更喜欢的选择

测试1.ps1:

Param ([ref]$OptionalOutput)

"Standard output"
$OptionalOutput.Value = "Optional Output"
Param ($OptionalOutput)

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

$x = ""
.\Test.ps1 ([ref]$x)
$x
$x = New-Object PSObject
.\Test.ps1 $x
$x.Summary

是的,我试图将Test2基本上看作一个带有“ByRef”(输出)参数的函数。您的语法非常接近。=左边的多个变量对我来说是新的,但我想我得到了:。我想要的唯一附加“特性”是能够调用Test2而不必看到$SummaryLine。换句话说,默认情况下只返回$Issues详细信息。我想我可以传递一个$ShowSummary布尔参数,只有在$ShowSummary=True时才输出$SummaryLine。我会使用一个[switch]参数,而不是布尔值。天哪,[ref]真管用!当我尝试这样做时,我在被调用的脚本中分配了$OptionalOutput而不是$OptionalOutput.Value,因此$x在调用脚本中没有更新。那么,您的第二种方法是什么?如果$x是一个PSObject,它会自动作为[ref]传递?我建议使用[ref],而不是第二个选项。在PowerShell(如.NET)中,对象通过引用传递,但变量的作用域是有限的。一开始可能很难理解,但这是真的。@JasonMArcher:是的,我喜欢[ref]更明确。重新。传递对象,如果所有对象都是通过引用传递的,为什么这对字符串不起作用(它是.NET引用类型的对象)?在[ref]示例中,$OptionalOutput不是对对象的引用,而是对变量$x的引用。因此,实际上可以更改变量$x的值。在addmember示例中,您没有更改$x引用的对象,而是更改对象本身。顺便说一句,它不必是PSObject,任何对象都可以,但PSObject是一个很好的空白对象。@标记它是引用,但字符串是不可变的,所以它也可以不是(使用PowerShell类型扩展系统添加成员除外)。