Generic/NSSM.ps1

function New-NssmService {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [string] $ServiceName,

        [Parameter(Mandatory=$true)]
        [string] $ExecutablePath,

        [Parameter(Mandatory=$false)]
        [string] $Arguments = "",

        [Parameter(Mandatory=$false)]
        [string] $WorkingDirectory = "",

        [Parameter(Mandatory=$false)]
        [int]    $RestartDelayMs = 5000,

        [Parameter(Mandatory=$false)]
        [string] $StdOutLog = "",

        [Parameter(Mandatory=$false)]
        [string] $StdErrLog = "",

        [Parameter(Mandatory=$false)]
        [bool] $Rotate = $true,

        [Parameter(Mandatory=$false)]
        [int] $RotateBytes = 10000000,

        [Parameter(Mandatory=$false)]
        [switch] $Start = $false
    )

    # 1) Установка службы
    nssm install $ServiceName $ExecutablePath

    # 2) Параметры запуска
    if ($Arguments) {
        nssm set $ServiceName AppParameters $Arguments
    }

    # 3) Рабочая директория
    if ($WorkingDirectory) {
        nssm set $ServiceName AppDirectory $WorkingDirectory
    }

    # 4) Автоматический запуск
    nssm set $ServiceName Start SERVICE_AUTO_START

    # 5) Перезапуск при сбое
    if ($RestartDelayMs -gt 0) {
        nssm set $ServiceName AppRestartDelay $RestartDelayMs
    }

    # 6) Логи stdout/stderr
    if ($StdOutLog) {
        nssm set $ServiceName AppStdout $StdOutLog
    }
    if ($StdErrLog) {
        nssm set $ServiceName AppStderr $StdErrLog
    }

    if ($Rotate) {
        nssm set $ServiceName AppRotateFiles 1
    }
    
    nssm set $ServiceName AppRotateBytes $RotateBytes

    # 7) Запуск службы
    try {
        if ($Start) {
            Start-Service $ServiceName -ErrorAction Stop
            Write-Host "Service '$ServiceName was created and running."
        }
    }
    catch {
        Write-Warning "Service '$ServiceName' created, but not started automatically: $_"
    }
}