【问题标题】:Environment Variable Refresh using Powershell DSC {not working}!使用 Powershell DSC 刷新环境变量 {不工作}!
【发布时间】:2016-05-10 22:32:38
【问题描述】:

在成功安装 JAVA 后,我的 DSC 脚本正在通过自定义模块设置 JAVA_HOME。

然后我尝试使用脚本资源中的以下行检索更新的 JAVA 主页 -

SetScript = "[Environment]::SetEnvironmentVariable('JAVA_HOME',[System.Environment]::GetEnvironmentVariable('JAVA_HOME','Machine'))"

我可以看到说明资源已执行的详细日志。但是,在脚本完成后,我的控制台仍然保留之前的 JAVA_HOME

我遇到的问题是,我的脚本(进一步向下)需要调用一个使用 JAVA_HOME 的批处理文件,但由于会话传递了错误的值,它失败了 “系统找不到路径指定”

谁能帮忙解决这个问题?

免责声明:我对 powershell 非常陌生。请详细说明。

【问题讨论】:

  • 你说'进一步向下'你的脚本失败了。如果您发布完整的脚本,包括设置环境和使用它的位置,那就太好了。由于复制不完整,我只能告诉你它是如何工作的,希望你能弄清楚如何修复它。

标签: powershell dsc


【解决方案1】:

作为一种更简洁的替代方案,环境有一个 DSC 资源。从他们在 GitHub 中的代码来看,如果您想尝试,它似乎也有 [environment]::GetEnvironmentVariable("FOOBAR", "MACHINE") 部分。

Environment [string] #ResourceName
{
    Name = [string]
    [ Ensure = [string] { Absent | Present }  ]
    [ Path = [bool] ]
    [ DependsOn = [string[]] ]
    [ Value = [string] ]
}

参考:https://docs.microsoft.com/en-us/powershell/dsc/environmentresource

代码:@Line 647

https://github.com/PowerShell/PSDscResources/blob/2c33e69634aa9c641ab27427d457fe9f49884e7c/DscResources/MSFT_EnvironmentResource/MSFT_EnvironmentResource.psm1#L647

【讨论】:

    【解决方案2】:

    下面的代码展示了如何做到这一点:

    configuration envtest
    {
        Script s1
        {
            GetScript  = {
    
            }
            SetScript  = {
                $ENV:FOOBAR > c:\temp\env.txt
            }
            TestScript = {
                [environment]::SetEnvironmentVariable("FOOBAR", "hi there", "MACHINE")
                $ENV:FOOBAR = [environment]::GetEnvironmentVariable("FOOBAR", "MACHINE")
                $false
            }
        }
    
        Script s2
        {
            GetScript = {   }
            TestScript = { $false }
            SetScript =  {   $ENV:FOOBAR > c:\temp\env2.txt }
            DependsOn = "[script]s1"
        }
    }
    
    envtest
    Start-DscConfiguration -force -Wait -Verbose -Path envtest
    

    请注意,在 DSC 脚本本身中,只有脚本资源可以利用运行时更改,例如新的 ENV 变量,但是只要脚本资源首先运行,由脚本生成的进程就会获取新变量。

    此外,虽然 ISE 会告诉您脚本资源需要字符串,但我们建议使用脚本块而不是字符串 - 这更简单,并且导致引用错误更少。如果您需要编写脚本来获取编译时变量的值,请使用 $using:myCompileTimeVariable 而不是 $myCompileTimeVariable,一切都应该正常工作。

    【讨论】:

    • 是的,布鲁斯,当您安装了更新路径的东西时,这是一个不错的小技巧。 DSC 不会从路径中获取它(直到 lcm 重新启动?)但是重新加载路径是一种享受! $ENV:Path = [环境]::GetEnvironmentVariable("PATH", "MACHINE")
    【解决方案3】:

    SetEvironmentVariable 为它运行的进程设置变量(默认情况下,它也可以为机器或用户设置它。)DSC 脚本作为一个单独的进程作为系统帐户运行,并且无法更新您的控制台。它基于已在机器级别更新的脚本显示。要在控制台中获取变量,您必须执行以下两项操作之一:

    • 使用 shell 启动新控制台
    • 从机器环境更新变量(就像您在上面的 DSC 代码中所做的那样)。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2010-10-09
      相关资源
      最近更新 更多