Не особо то я и торопился продолжить тему, начатую в этом посте. Всё же (спустя кучу времени) я допилил заветный скрипт для установки самодельных PowerShell-модулей в систему.
Скрипт будет производить установку модулей по пути, указанном в переменной $installpath:
$installpath = "$env:ProgramFiles\WindowsPowerShell\Modules"
Полный код скрипта:
param(
[Parameter(Mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType Leaf})]
[string]$ModulePath
)
[System.Console]::Title = "InstallCustomModule"
function InstallCustomModule
{
Param(
[Parameter(Mandatory=$true)]
[string]$ModulePath
)
$installpath = "$env:ProgramFiles\WindowsPowerShell\Modules"
$modulename = (Get-Item $ModulePath).BaseName
$modulefile = (Get-Item $ModulePath).Name
$moduledir = Join-Path $installpath $modulename
try
{
# Проверка прав администратора
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator"))
{ throw "Требуются права администратора для установки в Program Files" }
# Создание директории модуля
if (-NOT (Test-Path $moduledir))
{ New-Item -Path $moduledir -ItemType Directory -Force | Out-Null }
# Копирование файла модуля
Copy-Item -Path $ModulePath -Destination "$moduledir\$modulefile" -Force
# Проверка успешности копирования
if (Test-Path "$moduledir\$modulefile")
{ return "Модуль $modulename успешно установлен в $moduledir" }
else { throw "Не удалось скопировать файл модуля" }
}
catch { return "Ошибка: $($_.Exception.Message)" }
}
InstallCustomModule -ModulePath $ModulePath
В итоговом варианте скрипт принимает параметр ModulePath. Всё, что нужно — запустить скрипт с аргументом:
./PSInstallCustomModule.ps1 -ModulePath <disk:/path/to/module.psm1>
Проверить корректность установки модулей можно с помощью команды:
Get-Module -ListAvailable
Отдельно прошу обратить внимание на кирпичик кода:
# Проверка прав администратора
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator"))
{ throw "Требуются права администратора для установки в Program Files" }
Эта конструкция позволяет проверить наличие прав администратора во время текущей сессии работы скрипта.