Поделиться через


о_переменных_окружения

Краткое описание

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

Длинное описание

Переменные среды хранят данные, используемые операционной системой и другими программами. PowerShell создает следующие переменные среды:

  • POWERSHELL_TELEMETRY_OPTOUT
  • POWERSHELL_DISTRIBUTION_CHANNEL
  • POWERSHELL_UPDATECHECK
  • POWERSHELL_DIAGNOSTICS_OPTOUT
  • PSExecutionPolicyPreference
  • PSModulePath
  • PSModuleAnalysisCachePath
  • PSDisableModuleAnalysisCacheCleanup

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

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

Заметка

В отличие от Windows, имена переменных среды в macOS и Linux чувствительны к регистру. Например, $Env:Path и $Env:PATH являются различными переменными среды на платформах, отличных от Windows.

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

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

  • Область "Компьютер" (или "Система")
  • Область пользователя
  • Область процесса

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

При изменении переменных среды в PowerShell изменение влияет только на текущий сеанс. Это поведение напоминает поведение команды set в командной оболочке Windows и команде setenv в средах на основе Unix. Чтобы изменить значения в областях компьютера или пользователя, необходимо использовать методы класса System.Environment.

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

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

  • Синтаксис переменной
  • Командлеты поставщика среды и элемента
  • Класс .NET System.Environment

Использование синтаксиса переменной

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

$Env:<variable-name>

Например, чтобы отобразить значение переменной среды windir:

$Env:windir
C:\Windows

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

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

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

Например, чтобы создать переменную среды Foo:

$Env:Foo = 'An example'

Так как переменные среды всегда являются строками, их можно использовать как любую другую переменную, содержащую строку. Например:

"The 'Foo' environment variable is set to: $Env:Foo"
$Env:Foo += '!'
$Env:Foo
The 'Foo' environment variable is set to: An example

An example!

Начиная с PowerShell 7.5, можно задать переменную среды пустой строкой. Установка переменной среды для $null удаления из текущего сеанса. Например:

PS> $env:TEST = ''
PS> Get-ChildItem env:TEST

Name                           Value
----                           -----
TEST

PS> $env:TEST = $null
PS> $env:TEST.Length
0

PS> Get-ChildItem env:TEST

Get-ChildItem: Cannot find path 'TEST' because it does not exist.

Дополнительные сведения о переменных в PowerShell см. в about_Variables.

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

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

Например, чтобы создать переменную среды Foo со значением Bar:

New-Item -Path Env:\Foo -Value 'Bar'
Name                           Value
----                           -----
Foo                            Bar

Можно также скопировать переменную среды с Copy-Item, задать значение переменной среды с Set-Item, перечислить переменные среды с Get-Itemи удалить переменную среды с Remove-Item.

Copy-Item -Path Env:\Foo -Destination Env:\Foo2 -PassThru
Set-Item -Path Env:\Foo2 -Value 'BAR'
Get-Item -Path Env:\Foo*
Remove-Item -Path Env:\Foo* -Verbose
Name                           Value
----                           -----
Foo2                           Bar

Name                           Value
----                           -----
Foo2                           BAR
Foo                            Bar

VERBOSE: Performing the operation "Remove Item" on target "Item: Foo2".
VERBOSE: Performing the operation "Remove Item" on target "Item: Foo".

Используйте командлет Get-ChildItem, чтобы просмотреть полный список переменных среды:

Get-ChildItem Env:

Начиная с PowerShell 7.5, можно задать переменную среды пустой строкой с помощью поставщика среды и Set-Item командлета. Установка переменной среды для $null удаления из текущего сеанса. Например:

PS> Set-Item env:TEST 'Foo'
PS> Get-ChildItem env:TEST

Name                           Value
----                           -----
TEST                           Foo

PS> Set-Item env:TEST ''
PS> Get-ChildItem env:TEST

Name                           Value
----                           -----
TEST

PS> Set-Item -Path env:TEST -Value $null
PS> Get-ChildItem env:TEST
Get-ChildItem: Cannot find path 'TEST' because it does not exist.

Дополнительные сведения об использовании поставщика среды для управления переменными среды см. в about_Environment_Provider.

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

Класс System.Environment предоставляет методы GetEnvironmentVariable() и SetEnvironmentVariable() для получения и изменения переменных среды.

В следующем примере создается новая переменная среды Fooсо значением Bar, а затем возвращается его значение.

[Environment]::SetEnvironmentVariable('Foo','Bar')
[Environment]::GetEnvironmentVariable('Foo')
Bar

Начиная с PowerShell 7.5, можно задать переменную среды пустой строкой с помощью SetEnvironmentVariable() метода и указать пустую строку или $null значение переменной. Например:

PS> [Environment]::SetEnvironmentVariable('Foo','Bar')
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo                            Bar

PS> [Environment]::SetEnvironmentVariable('Foo','')
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo

PS> [Environment]::SetEnvironmentVariable('Foo','bar')
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo                            bar

PS> [Environment]::SetEnvironmentVariable('Foo',$null)
PS> Get-ChildItem env:Foo

Name                           Value
----                           -----
Foo

Заметка

В отличие от синтаксиса переменных и вариантов поставщика, назначение значения $null методу SetEnvironmentVariable() не удаляет переменную среды.

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

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

В Windows существует три метода для постоянного изменения переменной среды:

  • Установите их в вашем профиле
  • Использование метода SetEnvironmentVariable()
  • Использование панели управления системой

Установить переменные среды в вашем профиле

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

Например, чтобы создать переменную среды CompanyUri и обновить переменную среды PATH, чтобы включить папку C:\Tools, добавьте следующие строки в профиль PowerShell:

$Env:CompanyUri = 'https://internal.contoso.com'
$Env:PATH += ';C:\Tools'

Заметка

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

Путь к профилю PowerShell можно получить с помощью $PROFILE автоматической переменной. Дополнительные сведения о профилях см. в about_Profiles.

Задание переменных среды с помощью SetEnvironmentVariable()

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

Например, чтобы сохранить новую переменную среды Foo со значением Barдля всей системы:

[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')

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

[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')

Установка переменных среды в панели управления системой

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

Чтобы внести постоянное изменение в переменную среды в Windows с помощью панели управления системой:

  1. Откройте панель управления системой.
  2. Выберите Система.
  3. Выберите дополнительные параметры системы.
  4. Перейдите на вкладку Advanced.
  5. Выберите переменные среды....
  6. Внесите изменения.

Создание постоянных переменных среды на платформах, отличных от Windows

Linux и macOS имеют файлы конфигурации и скрипты, которые операционная система использует для задания переменных среды перед запуском приложения.

При запуске PowerShell в качестве оболочки по умолчанию (имя входа) можно определить переменные среды в файлах глобальной инициализации, поддерживаемых операционной системой. Например, в Linux можно добавить переменные среды в файл /etc/environment или создать скрипт, который задает переменные среды и поместить его в папку /etc/profile.d. В macOS можно добавить переменные среды в файл /etc/profile.

При запуске PowerShell из другой оболочки можно определить переменные среды в файлах инициализации, используемых оболочками без входа, например ~/.bashrc для bash или ~/.zshrc для zsh.

Дополнительные сведения см. в документации по операционной системе и оболочке по умолчанию.

Переменные среды PowerShell

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

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

  • POWERSHELL_TELEMETRY_OPTOUT

    Чтобы отказаться от телеметрии, задайте для переменной среды значение true, yesили 1. Дополнительные сведения см. в about_Telemetry.

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

  • POWERSHELL_DISTRIBUTION_CHANNEL

    Начиная с PowerShell 7.2, эта переменная среды устанавливается пакетами установщика для записи метода и источника установки для PowerShell.

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

  • POWERSHELL_UPDATECHECK

    Поведение уведомления об обновлении можно изменить с помощью переменной среды POWERSHELL_UPDATECHECK. Дополнительные сведения см. в about_Update_Notifications.

    Поддерживаются следующие значения:

    • Off отключает функцию уведомления об обновлении
    • Default равносильно отсутствию определения POWERSHELL_UPDATECHECK
      • Выпуски общедоступной версии уведомляют об обновлениях выпусков общедоступной версии
      • Предварительные выпуски и версии RC уведомляют об обновлениях для общедоступных и предварительных версий.
    • LTS только уведомляет об обновлениях выпусков общедоступной версии долгосрочной службы (LTS)

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

  • POWERSHELL_DIAGNOSTICS_OPTOUT

    Эта переменная среды была добавлена в PowerShell 7.6-preview.5. По умолчанию PowerShell создает именованный канал, используемый для межпроцессного взаимодействия (IPC), например Enter-PSHostProcess. PowerShell создает именованный канал при запуске, чтобы он был доступен для использования при необходимости.

    На платформах, отличных от Windows, именованные каналы реализуются в виде файлов в папке /tmp . Если PowerShell завершает работу, эти файлы не могут быть удалены. С течением времени эти файлы могут накапливаться.

    Начиная с PowerShell 7.6, POWERSHELL_DIAGNOSTICS_OPTOUT имеет falseзначение . Чтобы отключить создание именованного канала, задайте для переменной trueсреды значение , yesили 1.

  • PSExecutionPolicyPreference

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

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

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

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

    Эта информация относится только к платформе Windows. Дополнительные сведения см. в разделе about_Execution_Policies.

  • PSModulePath

    Переменная среды $Env:PSModulePath содержит список расположений папок, искомых для поиска модулей и ресурсов. В Windows список расположений папок разделен точкой с запятой (;) символом. На платформах, отличных от Windows, двоеточие (:) разделяет расположения папок в переменной среды.

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

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

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

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

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

    Для получения дополнительной информации см. about_PSModulePath.

  • 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 can't 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.

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

Другие переменные среды, используемые PowerShell

Сведения о пути

  • PATH

    Переменная среды $Env:PATH содержит список расположений папок, в которых операционная система ищет исполняемые файлы. В Windows список расположений папок разделен точкой с запятой (;) символом. На платформах, отличных от Windows, двоеточие (:) разделяет расположения папок в переменной среды.

  • PATHEXT

    Переменная $Env:PATHEXT содержит список расширений файлов, которые Windows считает исполняемыми файлами. Если файл скрипта с одним из перечисленных расширений выполняется из PowerShell, скрипт выполняется в текущем сеансе консоли или терминала. Если расширение файла не указано, скрипт запускается в новом сеансе консоли.

    Чтобы убедиться, что скрипты для другого языка сценариев выполняются в текущем сеансе консоли, добавьте расширение файла, используемое языком сценариев. Например, чтобы запустить скрипты Python в текущей консоли, добавьте расширение .py в переменную среды. Чтобы Windows поддерживало расширение .py в виде исполняемого файла, необходимо зарегистрировать расширение файла с помощью ftype и assoc команд командной оболочки CMD. PowerShell не имеет прямого метода регистрации обработчика файлов. Дополнительные сведения см. в документации для команды ftype.

    Скрипты PowerShell всегда начинаются в текущем сеансе консоли. Не нужно добавлять расширение .ps1.

  • переменные XDG

    На платформах, отличных от Windows, PowerShell использует следующие переменные среды XDG, определенные спецификацией базового каталога XDG.

    • XDG_CONFIG_HOME
    • XDG_DATA_HOME
    • XDG_CACHE_HOME

Функции терминала

Начиная с PowerShell 7.2, можно использовать следующие переменные среды для управления функциями виртуального терминала, такими как escape-последовательности ANSI, которые цветуют выходные данные. Поддержка escape-последовательностей ANSI может быть отключена с помощью переменных среды TERM или NO_COLOR.

  • TERM

    Следующие значения $Env:TERM изменяют поведение следующим образом:

    • dumb — задает $Host.UI.SupportsVirtualTerminal = $false
    • xterm-mono — задает $PSStyle.OutputRendering = PlainText
    • xterm — задает $PSStyle.OutputRendering = PlainText
  • NO_COLOR

    Если $Env:NO_COLOR существует, $PSStyle.OutputRendering получает значение PlainText. Дополнительные сведения об переменной среды NO_COLOR см. в https://no-color.org/.

См. также