PowerShell · 18.09.2026

Вдогонку без репозитория

Не особо то я и торопился продолжить тему, начатую в этом посте. Всё же (спустя кучу времени) я допилил заветный скрипт для установки самодельных 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" }

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