powershell - Invoke-Command 在本地运行时是在当前范围内运行还是在子范围内运行?
问题描述
我在另一篇帖子的评论中获悉:
至于
Invoke-Command
:不幸的是,文档不正确:默认情况下,本地调用发生在子范围内,但您可以选择使用-NoNewScope
. – mklement0
但是,根据帮助文档(强调添加):
您还可以在本地计算机上使用 Invoke-Command 来评估或运行脚本块中的字符串作为命令。Windows PowerShell 将脚本块转换为命令并立即在当前范围内运行命令,而不是仅仅在命令行中回显字符串。
这似乎按预期工作:
PS C:\> $TestVar = 99
PS C:\> Invoke-Command { Get-Variable TestVar }
Name Value
---- -----
TestVar 99
如果文档有误,我希望这会导致变量对Invoke-Command
. 文档到底是正确的吗?
解决方案
该文档提供了混合信息,并且问题中引用的部分肯定已过时/不正确。
提供正确信息的帮助部分如下-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
or-Session
参数。
截至 2019 年 8 月 21 日,文档更新请求已完成。问题中提到的问题部分的新版本现在显示为:
You can also use `Invoke-Command` on a local computer to a script block as a command.
PowerShell runs the script block immediately in a child scope of the current scope.
推荐阅读
- nlog - NLog:如何为不同的级别使用不同的布局?
- php - 加载 XML 文件,将所有“X”替换为“Y”并继续使用文件
- azure-devops - 如何在 Azure Devops Linux 客户端中指定 GCC 版本
- angular - 使用 RxJS 构建复杂的互连请求
- node.js - 我有什么办法可以将 nodejs 应用程序作为服务器运行并与已部署的电子应用程序通信?
- jenkins - jenkins 抛出 java.lang.IllegalArgumentException:当我尝试绕过 SSL 错误时出现预期的命名参数
- javascript - 模态窗口导致父页面正文滚动到顶部
- java - 即使在加载图像时,Spring Boot App 也会为资源中的所有静态内容返回 401
- android - 只需缓冲视频即可在视频视图中播放视频,而无需首先下载完整视频。有没有这方面的图书馆?
- selenium - 使用带有 127.0.0.1 的内容脚本和带有 Firefox 插件的自定义端口