在comment on another post中,我被告知:
至于
Invoke-Command
:很遗憾,文档不正确:通过 默认情况下,本地调用发生在子作用域中,但是您可以选择-NoNewScope
进入同作用域执行。 – mklement0
但是,根据help documentation(强调为重点):
您还可以在本地计算机上使用Invoke-Command进行评估或运行 脚本块中的字符串作为命令。 Windows PowerShell转换 将脚本块添加到命令中,并在 当前作用域,而不仅仅是在命令行中回显字符串。
这似乎可以正常工作:
PS C:\> $TestVar = 99
PS C:\> Invoke-Command { Get-Variable TestVar }
Name Value
---- -----
TestVar 99
如果文档有误,我希望这会导致该变量对于Invoke-Command
不可用。毕竟文档正确吗?
答案 0 :(得分:3)
文档提供了多种信息,问题中引用的部分肯定已过时/不正确。
提供正确信息的帮助部分位于-NoNewScope
下,其中指出:
指示此cmdlet在当前环境中运行指定的命令 范围。默认情况下,Invoke-Command在其自己的范围内运行命令。
此参数仅在当前运行的命令中有效 会话,即同时省略ComputerName和Session的命令 参数。
此参数是Windows PowerShell 3.0中引入的。
以下显示来自-NoNewScope
的合并范围信息是正确的(以带编号的合并范围显示):
$TestVar = 99
Invoke-Command { Get-Variable TestVar -Scope 0 } #Scope 0, current scope
Invoke-Command { Get-Variable TestVar -Scope 1 } #Scope 1, parent scope
Invoke-Command { Get-Variable TestVar -Scope 0 } -NoNewScope #Scope 0, current scope
第一个命令的结果将返回一个错误,指出找不到该变量:
PS C:\> Invoke-Command { Get-Variable TestVar -Scope 0 } #Scope 0, current scope
Get-Variable : Cannot find a variable with the name 'TestVar'.
其他命令将按预期返回变量信息。但是,如另一篇文章的评论中所述,必须使用-NoNewScope
明确告诉Invoke-Command
使用当前作用域,否则它将默认在子作用域中运行。
该命令中的命令起作用的唯一原因是因为默认情况下变量可用于子作用域,并且由于未使用-ComputerName
或-Session
参数而无需声明任何作用域。