2

Я не понимаю этого. Поэтому в настоящее время моя системная переменная среды с именем "PSModulePath" выглядит следующим образом:

%ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules

Теперь обратите внимание на следующий скрипт PowerShell:

$envarname = "PSModulePath"
$envar = (get-item env:$envarname).Value
[Environment]::SetEnvironmentVariable($envarname, $envar + ";C:\Expedited", "Machine")

Все, что нужно сделать, это добавить путь «C:\Expedited» в переменную среды PSModulesPath, верно? Что ж, после запуска этого скрипта от имени администратора переменная среды PSModulePath изменится на следующую:

C:\Users\Username\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules;C:\Expedited

Обратите внимание, как:

  1. Первоначально существовало два пути, каждый из которых содержал процентные знаки (переменные) в оригинале, но впоследствии все они изменились непосредственно в жестко закодированные пути.
  2. Путь «C:\Users\ Имя пользователя \ Documents \ WindowsPowerShell \ Modules» возник из ниоткуда (его не было в оригинале!)

Я понятия не имею, почему произошла какая-то из этих двух вещей. При добавлении пути к этой переменной я хотел бы сохранить его как можно ближе к оригиналу, а не вносить все эти другие изменения. Есть ли способ сохранить процентные знаки, которые были потеряны? Как правильно редактировать эту переменную среды из PowerShell?

2 ответа2

2

PowerShell - получите переменные среды ОС без расширения

Вы можете использовать командлет Get-Item с параметром -path а затем передать этот путь к ключу реестра, содержащему переменную среды PSModulePath .

Затем вы можете использовать RegistryKey.Метод GetValue вместе с DoNotExpandEnvironmentNames для получения строкового значения переменной среды PSModulePath без его расширения.


PowerShell

$envarname = "PSModulePath"
$regkey    = Get-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$envar     = $regkey.GetValue($envarname, "", "DoNotExpandEnvironmentNames")
ECHO $envar

Примечание: Вы будете хотеть быть уверенным, что вы запускаете это из командной строки PowerShell с повышенными правами администратора или экрана ISE для его корректной работы.


Дополнительные ресурсы

  • Как: установить переменную среды в Windows - командная строка и реестр

    Расположение пользовательских переменных в реестре: HKEY_CURRENT_USER\Environment . Расположение системных переменных в реестре:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    

    При настройке переменных среды через реестр они не распознаются сразу. Один из вариантов - выйти и снова войти. Тем не менее, мы можем избежать выхода из системы, если отправим сообщение WM_SETTINGCHANGE , которое является просто еще одной строкой, когда это делается программно, однако, если это делается в командной строке, это не так просто.

  • Get-Item

  • RegistryKey.Метод GetValue

    Извлекает значение, связанное с указанным именем и параметрами поиска. Если имя не найдено, возвращает заданное вами значение по умолчанию.

  • RegistryKey.Метод GetValue (String, Object, RegistryValueOptions)

    Используйте эту перегрузку, чтобы указать специальную обработку полученного значения. Например, вы можете указать RegistryValueOptions.DoNotExpandEnvironmentNames при получении значения реестра типа RegistryValueKind.ExpandString для извлечения строки без расширения переменных встроенной среды.

0

Вы делаете дополнительные шаги, которые на самом деле не нужны для вашей конечной цели. Просто используйте значение по умолчанию, как показано в руководстве MS.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-6

Таким образом, основываясь на приведенной выше статье, вам нужен только последний пример или только одна строка, используя встроенные переменные среды по умолчанию / автоматические.

[System.Environment]::SetEnvironmentVariable("PSModulePath", $Env:PSModulePath + ";C:\Expedited","Machine")

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .