我希望使用Invoke-Command将环境变量从调用计算机传递到执行Invoke-Command的服务器。
我希望这能奏效:
Invoke-Command -ComputerName MyServer-ScriptBlock {
$env:VAR=$using:env:USERNAME
Write-Host $env:VAR
}
但是这个命令的输出是空的。如果我不使用$using作用域修饰符,而直接给变量赋值,我会得到预期的输出(“VAR”)。
Invoke-Command -ComputerName MyServer -ScriptBlock {
$env:VAR="VAR"
Write-Host $env:VAR
}
那么,我可以将$using与环境变量一起使用吗?如果不能,有没有一种简单的方法将环境变量传递到运行Invoke-Command的远程计算机上?
3条答案
按热度按时间9vw9lbht1#
一个选项是在调用之前将环境变量分配给标准变量:
请注意,一旦会话结束,像这样分配环境变量(
$env:VAR=<value>
)就不会持续。请使用Environment.SetEnvironmentVariable()方法来完成此操作。hiz5n14c2#
我认为你可以使用
-ArgumentList
。请参阅https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-6rxztt3cl3#
更新:下面描述的错误已在v7.3中得到修复。
现有答案显示了有用的 * 解决方法 *。
看起来您遇到了一个 * 错误*,最高支持PowerShell 7.2.x:
$using:
作用域-这是在所有 out-of-runspace 执行中访问调用方作用域中的变量值所必需的**(参见this answer)-*还应 * 支持命名空间变量表示法(参见this answer)。因此,您 * 应该 * 能够将名称空间标记法变量引用(如
$env:USERNAME
)作为$using:env:USERNAME
传递:Start-Job
启动的基于子进程的后台作业和以Start-ThreadJob
启动的基于线程的作业)的上下文中执行;例如:Invoke-Command
-ComputerName
)配合使用,就像您的情况一样。GitHub issue #16019中已报告潜在错误。