如何从Chocolatey包中设置Machine环境变量?

时间:2014-01-27 22:20:03

标签: powershell escaping environment-variables chocolatey

我是几个Chocolatey软件包的作者,需要将环境变量设置为软件包的正确“安装”的一部分。例如:Java生态系统中的ANT_HOMEMW_HOMEJAVA_HOME应分别指向ant,weblogic和java的安装目录。

而且,由于Chocolatey是一个机器范围的包管理器,我的想法是在机器范围内设置这些(MSDN)。

[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "path/to/jre/install", "Machine")

如果我只是运行它,我会得到预期的权限异常

  

使用“3”参数调用“SetEnvironmentVariable”的异常:“不允许请求的注册表访问。”

如果我在高架提示中手动运行相同的命令,一切正常。所以,我需要在提升的提示中调用它。使用Chocolatey,您应该使用:[Start-ChocolateyProcessAsAdmin][2],如此

Start-ChocolateyProcessAsAdmin @"
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "path/to/jre/install", "Machine")
"@

它提示提升(我在开发时总是在正常提示下运行,以确保它确实正常工作),但是我看到红色错误闪过,此消息没有警告/错误

  

提升权限并运行C:\ windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe -NoProfile -ExecutionPolicy unrestricted -Command“& import-module -name”C:\ Chocolatey \ chocolateyinstall \ helpers \ chocolateyInstaller。 psm1';尝试{[System.Environment] :: SetEnvironmentVariable(“JAVA_HOME”,“path / to / jre / install”,“Machine”); start-sleep 6;} catch {write-error'那不是成功的' ;启动睡眠    8; throw;}“。这可能需要一段时间,具体取决于陈述。

是什么给出了?


更新

以下的某些组合使其工作,神秘地...添加行终止符(甚至是单个语句)并将所有参数包装在单引号中。

Start-ChocolateyProcessAsAdmin @"
[System.Environment]::SetEnvironmentVariable('JAVA_HOME', 'path/to/jre/install', 'Machine');
"@

我仍然想要一个非暴力的答案。我确信它是PowerShell的噩梦字符串引用/解释规则+ Chocolatey的调用的组合。


更新

即使我将它们分开,我也遇到了多个语句的问题!

Start-ChocolateyProcessAsAdmin @"
[System.Environment]::SetEnvironmentVariable('MW_HOME', 'path/to/wl/install', 'Machine');
[System.Environment]::SetEnvironmentVariable('WL_HOME', 'path/to/wl/install/wlserver', 'Machine');
"@

我看到了,但没有捕获,屏幕上的Chocolatey日志声明显示其中一个行终结符被删除了!


想:

我的意思是,我应该不这样做并编写一个简单的“用户”环境变量吗?这不对!该死的东西安装在整个机器上......我不想放弃。

1 个答案:

答案 0 :(得分:6)

为什么不使用built in helperInstall-ChocolateyEnvironmentVariable。用法非常简单......

Install-ChocolateyEnvironmentVariable 'JAVA_HOME' 'path\to\jre' 'Machine'