成功安装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代码中所做的)