Как установить переменную среды Machine из пакета Chocolatey?

Я являюсь автором нескольких пакетов Chocolatey, которым необходимо установить переменные среды как часть правильной «установки» пакета. Например: ANT_HOME, MW_HOME и JAVA_HOME в экосистеме Java должны указывать на каталог установки для ant, weblogic и java соответственно.

И, поскольку Chocolatey является менеджером пакетов для всей машины, я подумал бы установить эти для всей машины (MSDN).

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

Если я просто запущу это, я получу ожидаемое исключение разрешения

Исключение, вызывающее «SetEnvironmentVariable» с «3» аргументами: «Запрошенный доступ к реестру не разрешен».

Если я запускаю ту же команду в приглашении с повышенными правами вручную, все работает нормально. Итак, мне нужно вызвать его в приглашении с повышенными правами. С 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 unstricted -Command "& import-module -name 'C:\Chocolatey\chocolateyinstall\helpers\chocolateyInstaller.psm1'; попробуйте {[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "путь/к/jre/установить", "Машина"); 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 на экране, в которой было показано, что один из разделителей строк удален!


МЫСЛИ:

Я имею в виду, должен ли я просто не делать этого и вместо этого написать простую переменную среды «Пользователь»? Это неправильно! Эти чертовы штуки установлены на всю машину... Я пока не хочу сдаваться.


person Anthony Mastrean    schedule 27.01.2014    source источник
comment
Ух, мое обновление тоже глючит! Если я вручную выполняю его в обычном сеансе, он работает. Если я позволю Шоколадке управлять им, это будет выглядеть произвольно.   -  person Anthony Mastrean    schedule 28.01.2014


Ответы (1)


Почему бы не использовать для этого встроенный помощник, Install-ChocolateyEnvironmentVariable. Применение довольно простое...

Install-ChocolateyEnvironmentVariable 'JAVA_HOME' 'path\to\jre' 'Machine'
person ferventcoder    schedule 29.01.2014
comment
Потому что я не слежу за своими помощниками и не знал, что они существуют! - person Anthony Mastrean; 29.01.2014