【问题标题】:Append to a variable from invoke-command从调用命令附加到变量
【发布时间】:2018-03-19 11:02:07
【问题描述】:

我需要Invoke-Command的变量输出,但是打印时显示为空,下面是示例代码:

$ServiceName = "Service"

Invoke-Command -ScriptBlock {

        try {
            iisreset
            $BodyContent += "Server: <b>$server</b> IIS reset completed<br>"

        }
        catch {
            $BodyContent += "Server: <b>$server</b> is Failed to restart IIS<br>"
            $ErrorStat = 1
        }

        try {
            Stop-Service -DisplayName $using:ServiceName
            $BodyContent += "Server: <b>$server</b> is successfully Stopped $using:ServiceName<br>"
        }
        catch {
            $BodyContent += "Server: <b>$server</b> is failed to Stop $using:ServiceName<br>"
            $ErrorStat = 1
        }

        try {
            Start-Service -DisplayName $using:ServiceName
            $BodyContent += "Server: <b>$server</b> is successfully Started $using:ServiceName<br>"
        }
        catch {
            $BodyContent += "Server: <b>$server</b> is failed to Start $using:ServiceName<br>"
            $ErrorStat = 1
        }

    } -ComputerName $server -Credential $user -ErrorAction Stop

这里,我要捕获$BodyContent$ErrorStat

【问题讨论】:

标签: powershell scope invoke-command


【解决方案1】:

Invoke-Command 将打印到管道末尾的内容返回给您。如果你想返回一个变量,你应该Return &lt;variable&gt; 喜欢:

$ret = Invoke-Command -ScriptBlock { $var="test string"; return $var; }

其中$ret 现在包含值test string

当您有多个要返回的变量时,您可以将它们连接成一个变量,例如像这样:

$str1 = "test"
$str2 = "123"
$combinedObjs = New-Object PSObject -Property @{1 = $str1; 2 = $str2}

现在您可以将它们全部组合起来

$ret = Invoke-Command -ScriptBlock { 
  $str1 = "test";
  $str2 = "123";
  $combinedObjs =  @{val1 = $str1; val2 = $str2};
  Return $combinedObjs;
}

现在$ret 包含

Name                           Value
----                           -----
val1                           test
val2                           123

您可以通过调用$ret.val1$ret.val2 访问它们

【讨论】:

  • 我会说打印到屏幕上的内容不准确。
  • 更新了我的文字。这对我来说是不好的措辞
  • 完美!我建议进行编辑,但这现在被您的覆盖了,这没关系。我只想从内联代码块中删除引号,因为它们 - 从语法上讲 - 不是值的一部分,但这是我的一种小事;)
【解决方案2】:

在给定脚本块的最后添加一些输出,例如

    @{  BodyContent = $BodyContent
        ErrorStat   = $ErrorStat
    }

如果您使用例如

$result = Invoke-Command -ScriptBlock { 

    ###  original script block body here

    @{  BodyContent = $BodyContent
        ErrorStat   = $ErrorStat
    }
}  -ComputerName $server -Credential $user -ErrorAction Stop

然后你可以检查

$result.BodyContent
$result.ErrorStat

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多