使用Powershell DSC进行环境变量刷新{不工作}!

时间:2016-05-10 22:32:39

标签: powershell dsc

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

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

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

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

我遇到的问题是,我的脚本(进一步向下)需要调用使用JAVA_HOME的批处理文件,但因为会话传递了错误的值而导致失败“系统无法找到路径指定的“

有人可以帮助解决这个问题吗?

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

3 个答案:

答案 0 :(得分:1)

以下代码显示了如何执行此操作:

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,一切都应该正常工作。

答案 1 :(得分: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 :(得分:0)

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

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