Раздел: Tutorial

Пользовательские профили

Профиль PowerShell — это сценарий (набор команд), который выполняется непосредственно при запуске PowerShell. В основном профили используются для сохранения заранее созданных настроек оболочки. PowerShell имеет возможность использования разных хостов, т.е. интерфейсов языка, одним из которых является powershell.exe.
(Другим хостом может быть, например, POSH Console, не входящая в состав Windows).

В соответствии с этим, в PowerShell возможно существование четырёх профилей:

  • «$env:windirsystem32WindowsPowerShellv1.0profile.ps1″

Профиль profile.ps1, находящийся в этой директории будет действовать для всех пользователей и всех хостов;

  • «$env:windirsystem32WindowsPowerShellv1.0Microsoft.PowerShell_profile.ps1″

Профиль Microsoft.PowerShell_profile.ps1, находящийся в этой директории будет действовать для всех пользователей и только на powershell.exe;

  • «$homeDocumentsWindowsPowershellprofile.ps1″

Профиль profile.ps1, находящийся в этой директории будет действовать для текущего пользователя и всех хостов;

  • «$homeDocumentsWindowsPowershellMicrosoft.PowerShell_profile.ps1″

Профиль profile.ps1, находящийся в этой директории будет действовать для текущего пользователя и и только на powershell.exe;

Напомню, что переменная $env:HOMEPATH (или $home) содержит путь к профилю текущего пользователя, а переменная $env:windir путь к системной папке Windows,  набрав в командной строке PowerShell их названия, можно увидеть их значения:

В PowerShell существует переменная $profile, которая хранит путь к профилям по умолчанию.

Просмотреть её значение можно следующей командой:


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

Проверить существования профиля можно командой Tesh-Path. Она проверит существование профиля C:UsersVasiliyDocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1:

Команда вернула значение False, значит профиля не существует.

Можно проверить сразу все четыре профиля:

Как видно, профилей не существует вообще.

Давайте посмотрим, как можно изменить некоторые настройки PowerShell.

Командлет Get-Host по умолчанию выводит информацию об оболочке PowerShell:

Свойство UI — это объект .NET класса System.Management.Automation.Internal.Host.InternalHostUserInterface, который сам имеет свойство RawUI. Это свойство позволяет получать доступ к следующим параметрам окна PowerShell:

Изменять эти параметры можно так:
Code:
(Get-Host).UI.RawUI.ForegroundColor="black"
(Get-Host).UI.RawUI.backgroundColor="white"
(Get-Host).UI.RawUI.CursorSize=10
(Get-Host).UI.RawUI.WindowTitle="My PowerShell console"
Clear-Host

После изменения цвета фона нужно вызвать командлет Clear-Host, который очищает экран, как и команда cls в командной строке cmd. Для неё, кстати, в PowerShell, есть такой же псевдоним — cls. Иначе,фон будет изменяться только при наличии текста в консоли.

Посмотрим, что получилось:

За приглашение в оболочке Powershell отвечает функция prompt. Она отображает символы «PS», путь к текущему каталогу «C:» и символ «>». Вид этого приглашения можно изменить. Для начала, посмотрим, как эта функия описана:
Code:
(get-item function:prompt).definition

Таков будет результат:
$(if (test-path variable:/PSDebugContext) { '[DBG]: ' } else { '' }) + 'PS' + $(Get-Location) + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> '

Не влезая в сложности, в двух словах поясню: ‘PS’ — это текст, который можно заменить на любой другой текст или удалить, $Get-Location — командлет, показывающий текущую директорию, ‘>>’ — это приглашение для повышенного уровня вложенности, за который отвечает переменная $nestedpromptlevel (это приглашение вы можете видеть, например, когда описываете тело функции), и — ‘>’ — обычный символ приглашения, после которого вы вводите все ваши команды.

Изменим функцию prompt (о функциях написано в соответствующей статье) :

Code:
function prompt { $(if (test-path variable:/PSDebugContext) { '[DBG]: ' } else { '' }) + 'location: ' + $(Get-Location)+ $(if ($nestedpromptlevel -ge 1) { '>>' }) + ' ->'

И, вот, что мы получим:

Как видите, приглашение соответствует нашему шаблону, и содержит и изменяет текущую директорию в своём приглашении, как и раньше.

Кстати, моё окно Powershell всегда имеет путь «C:», хотя по умолчанию окно всегда открывается в директории «C:usersusername». Эту настройку тоже можно записать в файл профиля, использовав команду Set-Location C:

Так же, в профиль можно записать какие-нибудь алиасы.

Подведём итоги: открываем блокнот (или любой текстовый редактор), и пишем:

# записываем изменение настроек окна
(Get-Host).UI.RawUI.ForegroundColor="black"
(Get-Host).UI.RawUI.backgroundColor="white"
(Get-Host).UI.RawUI.CursorSize=10
(Get-Host).UI.RawUI.WindowTitle="My PowerShell console"
# изменяем приглашение PowerShell
function prompt { $(if (test-path variable:/PSDebugContext) { '[DBG]: ' } else { '' }) + 'location: ' + $(Get-Location)+ $(if ($nestedpromptlevel -ge 1) { '>>' }) + ' ->'
#запишем какие-нибудь алиасы:
Set-Alias lst Get-ChildItem>
#Изменим директорию, в которой начинаем работать:>
Set-Location C:>
# очищаем экран, чтобы введённые нами команды не отображались на экране, и применились цветовыые настройки
Clear-Host

Сохраняем файл по одному из четырёх описанных выше адресов, например:
C:UsersusernameDocumentsWindowsPowershellprofile.ps1
Обратите внимание, что файл должен иметь расширение .ps1, а не .txt!
теперь можно запустить powershell, и увидеть изменившиеся настройки профиля.

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

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

File C:UsersVasiliyDocumentsWindowsPowerShellprofile.ps1 cannot be loaded. The file C:UsersVasiliyDocumentsWindowsPowerShell
profile.ps1 is not digitally signed. The script will not execute on the system. Please see "get-help about_signing" for more details..
At line:1 char:2
+ . <<<<  'C:UsersVasiliyDocumentsWindowsPowerShellprofile.ps1'
+ CategoryInfo          : NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId : RuntimeException

Текущий параметр выполнения политик можно узнать командой Get-ExecutionPolicy:

Параметр Restricted означает, что любое выполнение сценариев на компьютере запрещено. Этот параметр следует изменить на Unrestricted(подробнее обо всех параметрах читайте в справке: get-help Set-ExecutionPolicy -full). Сделать это омжно с помощью командлета Set-ExecutionPolicy. Помните, что для этого PowerShell должен быть запущен с правами администратора(правой кнопкой на ярлыке PowerShell -> Run As Administrator). Powershell должен будет запросить у вас подтверждение выполнения команды:

Вот, собственно, и всё. Теперь вы можете запускать любые сценарии, и ваши профили будут применяться при запуске сеансов PowerShell автоматически.

Комментировать

Комментарии

четрынадцать − тринадцать =