Сведения о переменных среды
КРАТКОЕ ОПИСАНИЕ
Описывает, как получить доступ к переменным среды 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 }
- Windows PowerShell 5.1:
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
.
- В Windows расположением конкретного пользователя CurrentUser область является
Кроме того, программы установки, устанавливающие модули в других каталогах, таких как каталог 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 см. в разделе Методы среды.