Создать переменную среды пользователя с расширяемым значением - PullRequest
0 голосов
/ 30 мая 2018

Я могу легко создать переменную среды пользователя в скрипте Powershell (Windows 10).

[System.Environment]::SetEnvironmentVariable('name', 'value', 'User')

Когда переменная должна содержать другуюпеременная окружения пользователя как %OTHERVAR%;static_part, я обнаружил, что тип должен быть ExpandString.Это можно сделать следующим образом:

Set-ItemProperty HKCU:\Environment 'name' 'value' -Type ExpandString

Итак, я написал следующий код

[System.Environment]::SetEnvironmentVariable('M2_HOME', 'C:\dev\app\apache-maven-3.3.9', 'User')
# special treatment to get expandable type
Set-ItemProperty HKCU:\Environment 'PATH' '%M2_HOME%\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;' -Type ExpandString

Write-Host ([System.Environment]::GetEnvironmentVariable('M2_HOME', 'User'))
Write-Host ([System.Environment]::GetEnvironmentVariable('PATH', 'User'))
Write-Host 

Вывод:

C:\dev\app\apache-maven-3.3.9
C:\dev\app\apache-maven-3.3.9\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;

Все выглядит хорошо, обе переменные существуют,Когда я открываю элемент управления Windows для редактирования переменных среды пользователя, я вижу обе переменные, и значение PATH расширяется.Даже в regedit я вижу, что тип переменных правильный.

Однако, когда я открываю новый cmd и пытаюсь запустить двоичный файл с %M2_HOME%\bin (должен быть на PATH сейчас), он завершается неудачей .

Чтобы решить проблему вручную, мне просто нужно открыть элемент управления Windows для редактирования переменных среды пользователя, дважды щелкнуть по переменной PATH, ничего не редактировать и снова закрыть ее (ядумаю, он переписывает это).

Затем в новом cmd я могу запустить двоичные файлы из %M2_HOME%\bin.

Есть идеи, как заставить эту PATH переменную работать только через скрипт?

1 Ответ

0 голосов
/ 06 июня 2018

Слава @PetSerAl.Его ответ на сначала префикс переменной PATH со строкой-заполнителем, а затем создание переменной среды, которая удовлетворяет заполнителю, после чего работает отлично.

# special treatment to get expandable type
Set-ItemProperty HKCU:\Environment 'PATH' '%M2_HOME%\bin;C:\Users\UID20852\AppData\Local\Microsoft\WindowsApps;' -Type ExpandString
[System.Environment]::SetEnvironmentVariable('M2_HOME', 'C:\dev\app\apache-maven-3.3.9', 'User')

Если я правильно понимаю его объяснение в комментариях, потому что создание «нормальной» переменной вызывает событие, которое немедленно обновляет переменную с заполнителем.Так что это работает сразу после того, как скрипт сделан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...