变量未发送到远程会话
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
我有下面的代码,我一直在处理它,但我有一个问题,我无法让它将变量消息发送到计算机,如果我取出它工作的变量,但那不是我的正试图用它来完成。
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