2

我是几个 Chocolatey 包的作者,这些包需要设置环境变量作为正确“安装”包的一部分。例如:ANT_HOME、、MW_HOMEJAVA_HOME在Java生态系统中应该分别指向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 '那不成功';start-sleep 8;扔;}”。这可能需要一段时间,具体取决于语句。

是什么赋予了?


更新:

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

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 日志语句,显示其中一个行终止符已被删除!


想法:

我的意思是,我不应该这样做,而是编写一个简单的“用户”环境变量吗?这是不正确的!该死的东西安装在机器范围内......我还不想放弃。

4

1 回答 1

6

为什么不为此使用内置帮助器,Install-ChocolateyEnvironmentVariable. 用法很简单...

Install-ChocolateyEnvironmentVariable 'JAVA_HOME' 'path\to\jre' 'Machine'
于 2014-01-29T07:06:02.957 回答