【问题标题】:Passing a [ref] parameter in a remote session in Powershell在 Powershell 的远程会话中传递 [ref] 参数
【发布时间】:2016-07-28 09:18:15
【问题描述】:

我有一个 Powershell 问题。

我试图通过调用引用变量的函数来从函数中获取值到变量。 例如:

$var = New.Object System.Object;
Example-Function -OutObject ([ref]$var);

Example-Function 的定义如下:

function Example-Function
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true)]
        [ref]
        $OutObject
    )
    $SomeValue = ...
    #Write some output
    #Do something...

    $OutObject.Value = $SomeValue;
}

这工作正常。 $var 变量从函数 ($SomeValue) 中获取它的值。

但是,当将 Example-Function 导入远程会话时,这不起作用,例如:

$creds = New-Object System.Management.Automation.PSCredential('user','pass')
$session = New-PSSession -ComputerName 'ExampleComputer' -Credential $creds -Authentication CredSSP

Import-PSSession -Session $session -CommandName 'Example-Function' -AllowClobber

$var = New.Object System.Object;
Example-Function -OutObject ([ref]$var);

此代码引发以下错误:无法处理参数“OutObject”的参数转换。参数中需要引用类型。

我假设这是因为 Example-Function 现在正在另一台计算机('ExampleComputer')上运行,而 ([ref]$var) 正在引用运行脚本的计算机内存中的变量(我的计算机)。 我不想(不能)使用 return 语句方式的原因是因为我的函数正在编写一些输出,并且在 Powershell 中,从函数输出的所有内容都会返回。 所以,我的问题是,当函数在远程会话中运行时,我可以从一个有很多输出到变量中的函数中获取一个值吗? 如果使用[ref]参数不能做到,有没有别的办法?

谢谢

【问题讨论】:

    标签: function powershell parameters return remoting


    【解决方案1】:

    好的,让我们再试一次:

    Invoke-Command 返回远程管道中运行的任何内容。这意味着你可以这样做:

    $var = Invoke-Command -session $session -command {Example-Function}
    

    这会将所有内容保存在 $var 变量中。然后,您可以过滤结果并获取所需的任何信息。

    请记住[ref] 只会让一切变得比实际更复杂。

    【讨论】:

    • 感谢您的回答,但正如我所说,我已经在使用 Write-Output 进行日志记录,如果将所有内容保存到变量中,我将不会得到任何输出。另外,您确定您的第二个答案与我的示例有什么不同吗?
    • 好吧,你是对的,我没有回答你的问题。请查看更新后的问题
    • 通过这种方法我不会在屏幕上得到任何输出,除非我在函数完成处理后输出它。这意味着我无法使用这种方法获得实时输出,我需要它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2020-11-19
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多