Сведения о переменных среды

КРАТКОЕ ОПИСАНИЕ

Описывает, как получить доступ к переменным среды Windows в PowerShell.

ПОДРОБНОЕ ОПИСАНИЕ

Переменные среды хранят сведения о среде операционной системы. Эти сведения включают в себя такие сведения, как путь к операционной системе, количество процессоров, используемых операционной системой, и расположение временных папок.

В переменных среды хранятся данные, используемые операционной системой и другими программами. Например, WINDIR переменная среды содержит расположение каталога установки Windows. Программы могут запрашивать значение этой переменной, чтобы определить, где находятся файлы операционной системы Windows.

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

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

Использование и изменение переменных среды

В Windows переменные среды можно определить в трех областях:

  • область компьютера (или системы)
  • Область пользователей
  • Область процесса

Область процесса содержит переменные среды, доступные в текущем процессе или сеансе PowerShell. Этот список переменных наследуется от родительского процесса и создается из переменных в областях Компьютер и Пользователь . Платформы под управлением Unix имеют только область процесса.

Вы можете отображать и изменять значения переменных среды без использования командлета с помощью синтаксиса переменной с поставщиком среды. Чтобы отобразить значение переменной среды, используйте следующий синтаксис:

$Env:<variable-name>

Например, чтобы отобразить значение переменной WINDIR среды, введите следующую команду в командной строке PowerShell:

$Env:windir

В этом синтаксисе знак доллара ($) обозначает переменную, а имя диска (Env:) — переменную среды, за которой следует имя переменной (windir).

Изменение переменных среды в PowerShell влияет только на текущий сеанс. Это поведение похоже на поведение команды в командной Set оболочке Windows и Setenv команды в средах на основе UNIX. Чтобы изменить значения в области Компьютер или Пользователь, необходимо использовать методы класса System.Environment .

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

Значения переменных можно изменить без использования командлета, используя следующий синтаксис:

$Env:<variable-name> = "<new-value>"

Например, чтобы добавить ;c:\temp к значению переменной Path среды, используйте следующий синтаксис:

$Env:Path += ";c:\temp"

В Linux или MacOS двоеточие (:) в команде отделяет новый путь от пути, предшествующего ему в списке.

$Env:PATH += ":/usr/local/temp"

Вы также можете использовать командлеты Item, такие как Set-Item, Remove-Itemи Copy-Item , для изменения значений переменных среды. Например, чтобы использовать Set-Item командлет для добавления ;c:\temp к значению переменной Path среды, используйте следующий синтаксис:

Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")

В этой команде значение заключено в круглые скобки, поэтому оно интерпретируется как единица.

Переменные среды, в которой хранятся настройки

Функции PowerShell могут использовать переменные среды для хранения пользовательских настроек. Эти переменные работают как переменные предпочтения, но наследуются дочерними сеансами сеансов, в которых они создаются. Дополнительные сведения о переменных предпочтения см. в разделе about_preference_variables.

К переменным среды, в которых хранятся предпочтения, относятся:

  • PSExecutionPolicyPreference

    Хранит политику выполнения, заданную для текущего сеанса. Эта переменная среды существует только в том случае, если вы задали политику выполнения для одного сеанса. Это можно сделать двумя разными способами.

    • Запустите сеанс из командной строки, используя параметр ExecutionPolicy , чтобы задать политику выполнения для сеанса.

    • Используйте командлет Set-ExecutionPolicy. Используйте параметр Scope со значением "Process".

      Подробнее см. в разделе about_Execution_Policies.

  • PSModuleAnalysisCachePath

    PowerShell позволяет управлять файлом, который используется для кэширования данных о модулях и их командлетах. Кэш считывается при запуске при поиске команды и записывается в фоновом потоке через некоторое время после импорта модуля.

    Расположение кэша по умолчанию:

    • Windows PowerShell 5.1: $env:LOCALAPPDATA\Microsoft\Windows\PowerShell.
    • PowerShell 6.0 и более поздних версий: $env:LOCALAPPDATA\Microsoft\PowerShell
    • По умолчанию, отличные от Windows: ~/.cache/powershell

    Имя файла по умолчанию для кэша — ModuleAnalysisCache. Если установлено несколько экземпляров PowerShell, имя файла включает шестнадцатеричный суффикс, чтобы иметь уникальное имя файла для каждой установки.

    Примечание

    Если обнаружение команд работает неправильно, например Intellisense показывает команды, которые не существуют, можно удалить файл кэша. Кэш повторно создается при следующем запуске PowerShell.

    Чтобы изменить расположение кэша по умолчанию, задайте переменную среды перед запуском PowerShell. Изменения в этой переменной среды влияют только на дочерние процессы. Значение должно быть полным путем (включая имя файла), на создание и запись файлов по которому у среды PowerShell есть разрешение.

    Чтобы отключить файловый кэш, укажите в качестве этого значения недопустимое расположение, например:

    # `NUL` here is a special device on Windows that cannot be written to,
    # on non-Windows you would use `/dev/null`
    $env:PSModuleAnalysisCachePath = 'NUL'
    

    При этом задается путь к устройству NUL . PowerShell не может выполнить запись в путь, но ошибка не возвращается. Вы можете просмотреть ошибки, сообщаемые с помощью трассировки:

    Trace-Command -PSHost -Name Modules -Expression { Import-Module Microsoft.PowerShell.Management -Force }
    
  • PSDisableModuleAnalysisCacheCleanup

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

    Установка этой переменной среды вступает в силу немедленно в текущем процессе.

  • PSModulePath

    Переменная $env:PSModulePath среды содержит список расположений папок, в которых выполняется поиск модулей и ресурсов.

    По умолчанию фактические расположения назначаются $env:PSModulePath следующим образом:

    • Расположения на уровне системы. Эти папки содержат модули, поставляемые с PowerShell. Модули хранятся в расположении $PSHOME\Modules . Кроме того, это расположение, где установлены модули управления Windows.

    • Модули, установленные пользователем. Это модули, установленные пользователем. Install-Module имеет параметр Scope , позволяющий указать, установлен ли модуль для текущего пользователя или для всех пользователей. Дополнительные сведения см. в разделе Install-Module.

      • В Windows расположением конкретного пользователя CurrentUser область является $HOME\Documents\PowerShell\Modules папка. Расположение область AllUsers$env:ProgramFiles\PowerShell\Modules.
      • В системах, отличных от Windows, расположением область пользователя является $HOME/.local/share/powershell/Modules папка. Расположение область AllUsers/usr/local/share/powershell/Modules.

    Кроме того, программы установки, устанавливающие модули в других каталогах, таких как каталог Program Files, могут добавлять свои расположения к значению $env:PSModulePath.

    Дополнительные сведения см. здесь: about_PSModulePath.

Управление переменными среды

PowerShell предоставляет несколько различных методов управления переменными среды.

  • Диск поставщика среды
  • Командлеты Item
  • Класс .NET System.Environment
  • В Windows системный панель управления

Использование поставщика среды

Каждая переменная среды представлена экземпляром класса System.Collections.DictionaryEntry . В каждом объекте DictionaryEntry именем переменной среды является ключ словаря. Значение переменной является значением словаря.

Чтобы отобразить свойства и методы объекта , представляющего переменную среды в PowerShell, используйте Get-Member командлет . Например, чтобы отобразить методы и свойства всех объектов на Env: диске, введите:

Get-Item -Path Env:* | Get-Member

Поставщик среды PowerShell позволяет получать доступ к переменным среды на диске PowerShell ( Env: диске). Этот диск похож на диск файловой системы. Чтобы перейти к диску, введите Env: :

Set-Location Env:

Используйте командлеты Content для получения или задания значений переменной среды.

PS Env:\> Set-Content -Path Test -Value 'Test value'
PS Env:\> Get-Content -Path Test
Test value

Вы можете просмотреть переменные среды на диске с любого другого Env: диска PowerShell и перейти на Env: диск, чтобы просмотреть и изменить переменные среды.

Использование командлетов Item

При ссылке на переменную среды введите Env: имя диска, а затем имя переменной. Например, чтобы отобразить значение переменной среды, введите COMPUTERNAME :

Get-ChildItem Env:Computername

Чтобы отобразить значения всех переменных среды, введите:

Get-ChildItem Env:

Поскольку переменные среды не имеют дочерних элементов, выходные данные Get-Item и Get-ChildItem совпадают.

По умолчанию PowerShell отображает переменные среды в том порядке, в котором они извлекаются. Чтобы отсортировать список переменных среды по имени переменной, передайте выходные Get-ChildItem данные команды в Sort-Object командлет . Например, на любом диске PowerShell введите:

Get-ChildItem Env: | Sort Name

Вы также можете перейти на Env: диск с помощью командлета Set-Location :

Set-Location Env:

Когда вы находитесь на Env: диске, вы можете опустить Env: имя диска в пути. Например, чтобы отобразить все переменные среды, введите:

PS Env:\> Get-ChildItem

Чтобы отобразить значение переменной COMPUTERNAME на диске, введите Env: :

PS Env:\> Get-ChildItem ComputerName

Сохранение изменений в переменных среды

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

Кроме того, можно добавить или изменить переменные среды в профиле PowerShell. Этот метод подходит для любой версии PowerShell на любой поддерживаемой платформе.

Использование методов System.Environment

Класс System.Environment предоставляет методы GetEnvironmentVariable и SetEnvironmentVariable, позволяющие указать область переменной.

В следующем примере используется метод GetEnvironmentVariable для получения параметра PSModulePath компьютера и метод SetEnvironmentVariable для добавления C:\Program Files\Fabrikam\Modules пути к значению .

$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable("PSModulePath", $newpath, 'Machine')

Дополнительные сведения о методах класса System.Environment см. в разделе Методы среды.

СМ. ТАКЖЕ