about_Environment_Variables

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

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

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

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

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

Подробное описание

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

Примечание

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

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

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

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

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

Изменение переменных среды в 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 для переменной среды нельзя задать пустую строку. Если для переменной среды задано $null значение или пустая строка, она удаляется из текущего сеанса. Пример:

$Env:Foo = ''
$Env:Foo | Get-Member -MemberType Properties
Get-Member : You must specify an object for the Get-Member cmdlet.
At line:1 char:12
+ $env:foo | Get-Member
+            ~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand

Get-Member возвращена ошибка, так как переменная среды была удалена. Вы увидите, что он не возвращает ошибку при использовании в пустой строке:

'' | Get-Member -MemberType Properties
   TypeName: System.String

Name   MemberType Definition
----   ---------- ----------
Length Property   int Length {get;}

Дополнительные сведения о переменных в 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:

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

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

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

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

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

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

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

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

Create переменных постоянной среды в 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. Перейдите на вкладку Дополнительно .
  5. Выберите Переменные среды....
  6. Внесите нужные изменения.

Create постоянные переменные среды на платформах, отличных от 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:
      • В общедоступных выпусках выводятся уведомления об обновлениях для общедоступных выпусков.
      • В предварительных выпусках и релизах-кандидатах выводятся уведомления об обновлениях для общедоступных и предварительных выпусков.
    • LTS только уведомляет об обновлениях общедоступных выпусков долгосрочного обслуживания (LTS)

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

  • PSExecutionPolicyPreference

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

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

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

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

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

  • PSModulePath

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

    По умолчанию назначенные $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.

  • 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.

  • ТЕРМИН

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

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

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

См. также раздел