为什么 PowerShell 不允许使用using
使用时范围Invoke-Command
本地?根据文档, the using
修饰符只能用于远程命令。去引用:
从 PowerShell 3.0 开始,您可以使用Using范围修饰符来标识远程命令中的局部变量。
运行时可以演示此行为Invoke-Command
本地:
$myServerName = 'www.google.com'
Invoke-Command { ping $using:myServerName }
这会引发以下错误:
无法检索 using 变量。使用变量只能与脚本工作流程中的 Invoke-Command、Start-Job 或 InlineScript 一起使用。当它与 Invoke-Command 一起使用时,
仅当在远程计算机上调用脚本块时,使用变量才有效。
该错误表明远程使用using
修饰符仅远程有效,Invoke-Command
。所以,如果我们尝试使用运行相同的东西Start-Job
, 会发生什么?
$myServerName = 'www.google.com'
$j = Start-Job { ping $using:myServerName }
while( $j.State -eq 'Running' ){ Start-Sleep -s 1 }
Receive-Job $j
这不会引发错误,并且我得到了我期望的输出:
Pinging www.google.com [172.217.6.132] with 32 bytes of data:
Reply from 172.217.6.132: bytes=32 time=20ms TTL=56
Reply from 172.217.6.132: bytes=32 time=19ms TTL=56
Reply from 172.217.6.132: bytes=32 time=19ms TTL=56
Reply from 172.217.6.132: bytes=32 time=19ms TTL=56
为什么文档中指出using
范围修饰符只有在也可以在本地上下文中明确使用时才能远程工作?同样,如果它在本地环境中起作用Start-Job
,是什么阻止了它与当地人合作Invoke-Command
?
当使用“using”时确实如此,因为 using 的定义是,
从 PowerShell 3.0 开始,您可以使用Using范围修饰符来标识远程命令中的局部变量
任何时候你使用$using
,你必须提供-ComputerName
or -Session
参数目标服务器是本地主机还是远程服务器。
Ex.
$myServerName = 'www.google.com'
Invoke-Command { ping $using:myServerName }
### BIG ERROR.
$myServerName = 'www.google.com'
Invoke-Command { ping $using:myServerName } -computername $env:COMPUTERNAME
### Ping response.
$myServerName = 'www.google.com'
Invoke-Command { ping $myServerName }
### Ping Reponse.
$using:
仅在少数特定上下文中受支持,这些上下文有一个共同点:在当前运行空间之外运行的代码 - 所有其他上下文既不需要也不支持它。 (@mklement0)
[Invoke-Command
, Start-Job
, and InlineScript
是支持使用的已知上下文$using:
在当前本地会话中传递变量。]
有关可以使用的位置的文档$using
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)