我有下面的代码,我一直在努力,我有一个问题,我无法让它将变量消息发送到计算机,如果我取出它工作的变量,但这不是我在尝试完成它。
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 *'测试消息'
答案 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