变量不会发送到远程会话

时间:2016-07-27 19:13:37

标签: powershell powershell-v3.0

我有下面的代码,我一直在努力,我有一个问题,我无法让它将变量消息发送到计算机,如果我取出它工作的变量,但这不是我在尝试完成它。

Function Send-PopupMessage {
    #Requires -Version 2.0 
    [CmdletBinding()]  
    Param(
        [Parameter(Mandatory = $true)]
        [String]$ComputerName,
        [Parameter(Mandatory = $true)]
        [String]$Message
    )

    Invoke-Command -ComputerName $ComputerName -Scriptblock {
        $CmdMessage = "msg.exe * $Message"
        Write-Host $CmdMessage
        $CmdMessage | Invoke-Expression
    }
}

这与question linked不同,因为我正在使用PSWA与另一台计算机进行会话,因此我无法从此开始另一个会话。即使我改变了我的代码,使其更像是" Duplicate"问题我仍然得到与发送到另一台计算机的cmd相同的结果

  

msg.exe *''    代替   msg.exe *'测试消息'

1 个答案:

答案 0 :(得分:1)

默认情况下,PowerShell脚本块不是词法闭包。传递给Invoke-Command的scriptblock在另一台计算机上运行时不会保存$Message参数的当前值。

当块在远程会话中运行时,它正在该会话中使用当前值$Message。因为该变量很可能是$null,所以从您的命令中省略了该消息。

使用$using:variable语法described in this question来捕获$Message的值。

Invoke-Command -ComputerName $ComputerName -Scriptblock {
    $CmdMessage = "msg.exe * $using:Message"
    Write-Host $CmdMessage
    $CmdMessage | Invoke-Expression
}

$using:variable语法仅在远程计算机上调用块时有效。如果您需要捕获脚本块中的变量以进行本地执行,请在ScriptBlock上调用GetNewClosure()

$Message = "Hey there."
$closure = {
    $CmdMessage = "msg.exe * $Message"
    Write-Host $CmdMessage
    $CmdMessage | Invoke-Expression
}.GetNewClosure()

$Message = $null
Invoke-Command -Scriptblock $closure