使用Powershell DSC的环境变量刷新{不工作}



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

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

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

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

我遇到的问题是,我的脚本(更底层)需要调用一个使用JAVA_HOME的批处理文件,但由于会话传递了错误的值,它失败了,并出现"System cannot find The path specified"

有人能帮忙解决这个问题吗?

免责声明:我是powershell的新手。请详细解释。

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

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

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

代码:@Line 647

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

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

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

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

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

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

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

最新更新