在本地运行时,Invoke-Command是否在当前作用域或子作用域中运行?

时间:2019-07-11 16:31:01

标签: powershell scope

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不可用。毕竟文档正确吗?

1 个答案:

答案 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参数而无需声明任何作用域。