Я являюсь автором нескольких пакетов 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 на экране, в которой было показано, что один из разделителей строк удален!
МЫСЛИ:
Я имею в виду, должен ли я просто не делать этого и вместо этого написать простую переменную среды «Пользователь»? Это неправильно! Эти чертовы штуки установлены на всю машину... Я пока не хочу сдаваться.