Powershell调用-传递环境变量的命令

s4n0splo  于 2022-12-04  发布在  Shell
关注(0)|答案(3)|浏览(180)

我希望使用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的远程计算机上?

9vw9lbht

9vw9lbht1#

一个选项是在调用之前将环境变量分配给标准变量:

$username = $env:USERNAME

Invoke-Command -ComputerName MyServer-ScriptBlock {
    $env:VAR=$using:userName
    Write-Host $env:VAR
}

请注意,一旦会话结束,像这样分配环境变量($env:VAR=<value>)就不会持续。请使用Environment.SetEnvironmentVariable()方法来完成此操作。

hiz5n14c

hiz5n14c2#

我认为你可以使用-ArgumentList。请参阅https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/invoke-command?view=powershell-6

Invoke-Command -ComputerName MyServer -ArgumentList $env:USERNAME -ScriptBlock {
    Param ($x)

    Write-Host $x
}
rxztt3cl

rxztt3cl3#

更新:下面描述的错误已在v7.3得到修复。

现有答案显示了有用的 * 解决方法 *。

看起来您遇到了一个 * 错误*,最高支持PowerShell 7.2.x:
$using:作用域-这是在所有 out-of-runspace 执行中访问调用方作用域中的变量值所必需的**(参见this answer)-*还应 * 支持命名空间变量表示法(参见this answer)。

因此,您 * 应该 * 能够将名称空间标记法变量引用(如$env:USERNAME)作为$using:env:USERNAME传递:

  • 实际上,您 * 可以 * 在 * 作业 *(以Start-Job启动的基于子进程的后台作业和以Start-ThreadJob启动的基于线程的作业)的上下文中执行;例如:
$env:FOO = 'bar'
# Outputs 'bar', as expected.
Start-Job { $using:env:FOO } | Receive-Job -Wait -AutoRemoveJob
  • 但是,从PowerShell 7.1开始,它无法与PowerShell remoting(例如Invoke-Command-ComputerName)配合使用,就像您的情况一样。

GitHub issue #16019中已报告潜在错误。

相关问题