变量未发送到远程会话

Variable is not sent to remote session

我有下面的代码,我一直在处理它,但我有一个问题,我无法让它将变量消息发送到计算机,如果我取出它工作的变量,但那不是我的正试图用它来完成。

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 * '' instead of msg.exe * 'Test Message'

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

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

使用$using:variable语法获取$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