【问题标题】:Powershell Invoke-Command passing environment variablesPowershell Invoke-Command 传递环境变量
【发布时间】:2021-08-31 02:08:39
【问题描述】:

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

【问题讨论】:

    标签: powershell invoke-command


    【解决方案1】:

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

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

    请注意,一旦会话结束,分配这样的环境变量 ($env:VAR=<value>) 将不会持续存在。使用Environment.SetEnvironmentVariable() 方法来做到这一点。

    【讨论】:

    • 这似乎是最简单的方法。谢谢。
    【解决方案2】:

    我认为你可以使用-ArgumentList。见https://docs.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
    }
    

    【讨论】:

      【解决方案3】:

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

      您似乎遇到了一个错误,至少支持 PowerShell 7.1:

      $using: 作用域 - 在所有运行空间外执行中访问调用者作用域中的变量值时需要它(请参阅this answer) - 应该还支持命名空间变量表示法(请参阅this answer)。

      因此,您应该能够将$env:USERNAME 等命名空间符号变量引用作为$using:env:USERNAME 传递:

      • 确实可以jobs 的上下文中(基于子进程的后台作业以 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 中报告。

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-02
        相关资源
        最近更新 更多