Дима Яковлев

Профили PowerShell

Уверен, пользователи, занимающие автоматизацией задач в Bash, знают о файлах .profile, .bashrc и .bash_profile. Знают о том, что это за файлы и как их использовать, чтобы сделать работу в командной строке удобнее. Однако часть пользователей PowerShell не подозревают, что их инструмент обладает схожими возможностями - поддержкой профилей.

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

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

ОписаниеПуть к файлу профиля
Все пользователи, все хосты$PSHOME\Profile.ps1
Все пользователи, текущий хост$PSHOME\Microsoft.PowerShell_profile.ps1
Текущий пользователь, все хосты$Home[My ]Documents\PowerShell\Profile.ps1
Текущий пользователь, текущий хост$Home[My ]Documents\PowerShell\
Microsoft.PowerShell_profile.ps1 

В приведённых именах файлов профилей использованы следующие переменные:

Если обратиться к справке PowerShell, то в ней под понятием “ваш профиль PowerShell”, как правило, будет подразумеваться профиль “Текущий пользователь, текущий хост”.

Кроме перечисленных стандартных профилей, свои профили могут иметь программы, запускающие PowerShell, например, Visual Studio Code поддерживает следующие профили:

ОписаниеПуть к файлу профиля
Все пользователи, текущий хост$PSHOME\Microsoft.VSCode_profile.ps1
Текущий пользователи, текущий хост$Home[My ]Documents\PowerShell\
Microsoft.VSCode_profile.ps1 

Не обязательно запоминать все пути к профилям PowerShell, потому что они хранятся в автоматической переменной $PROFILE и их всегда можно посмотреть:

$PROFILE | Get-Member -Type NoteProperty
ОписаниеИмя
Текущий пользователь, текущий хост$PROFILE или $PROFILE.CurrentUserCurrentHost
Текущий пользователь, все хосты$PROFILE.CurrentUserAllHosts
Все пользователи, текущий хост$PROFILE.AllUsersCurrentHost
Все пользователи, все хосты$PROFILE.AllUsersAllHosts

Поскольу значения переменной $PROFILE меняются для каждого пользователя и для каждого приложения, запускающего PowerShell, следует всегда обращаться к значениям переменной, а не задавать жёстко пути к файлам профилей. Например, для того чтобы открыть файл вашего профиля PowerShell в Блокноте, выполните команду:

notepad $PROFILE

Из приведённой ранее таблицы видно, что обращение к переменной $PROFILE по имени равнозначно обращению к её свойству:

notepad $PROFILE.CurrentUserCurrentHost

В результате в Блокноте будет открыт файл вашего профиля PowerShell и при необходимости вы сможете внести в него требующиеся изменения.

Но как проверить, какие файлы профилей существуют, не пытаясь открыть каждый из них? Для этого запустите следующий скрипт:

"CurrentUserCurrentHost", "CurrentUserAllHosts", "AllUsersCurrentHost", "AllUsersAllHosts" | % { $profile.$_ } | Test-Path

В этом фрагменте кода использован символ % - это алиас для командлета ForEach-Object.

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

If (!(Test-Path -Path $PROFILE)) {
  New-Item -ItemType File -Path $PROFILE -Force
}

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

И всё-таки, какие из профилей использоваться для настройки среды PowerShell?

Если вы используете разные программы, запускающие PowerShell, но хотите иметь в каждом сеансе одинаковые настройки среды, поместите настройки в профиль $PROFILE.CurrentUserAllHosts.

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

  1. Общие настройки для всех пользователей храните в профиле $PROFILE.AllUsersAllHosts;
  2. Настройки, специфичные для приложений, запускающих PowerShell, храните в профиле ‎$PROFILE.AllUsersCurrentHost;
  3. Настройки, специфичные для каждого пользователя, храните в профиле $PROFILE.CurrentUserCurrentHost.

Может возникнуть ситуация, когда применение настроек профиля не желательно. В этом случае не надо переименовывать файл профиля и удалять его содержание, достаточно запустить PowerShell с параметром -NoProfile:

PowerShell -NoProfile

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