Generic/NSSM.ps1

function New-NssmService {
    [CmdletBinding(SupportsShouldProcess = $true)]
    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) Установка службы
    if ($PSCmdlet.ShouldProcess($ServiceName,
        "Create service with path $ExecutablePath")) {
        nssm install $ServiceName $ExecutablePath
    }

    # 2) Параметры запуска
    if ($Arguments) {
        if ($PSCmdlet.ShouldProcess($ServiceName,
            "Set args $Arguments")) {
            nssm set $ServiceName AppParameters $Arguments
        }
    }

    # 3) Рабочая директория
    if ($WorkingDirectory) {
        if ($PSCmdlet.ShouldProcess($ServiceName,
            "Set app directory $WorkingDirectory")) {
            nssm set $ServiceName AppDirectory $WorkingDirectory
        }
    }

    # 4) Автоматический запуск
    if ($PSCmdlet.ShouldProcess($ServiceName,
        "Set SERVICE_AUTO_START")) {
        nssm set $ServiceName Start SERVICE_AUTO_START
    }

    # 5) Перезапуск при сбое
    if ($RestartDelayMs -gt 0) {
        if ($PSCmdlet.ShouldProcess($ServiceName,
            "Set restarting delay ms $RestartDelayMs")) {
            nssm set $ServiceName AppRestartDelay $RestartDelayMs
        }
    }

    # 6) Логи stdout/stderr
    if ($StdOutLog) {
        if ($PSCmdlet.ShouldProcess($ServiceName,
            "Stdout log path $StdOutLog")) {
            nssm set $ServiceName AppStdout $StdOutLog
        }
    }
    if ($StdErrLog) {
        if ($PSCmdlet.ShouldProcess($ServiceName,
            "Stderr log path $StdErrLog")) {
            nssm set $ServiceName AppStderr $StdErrLog
        }
    }

    if ($Rotate) {
        if ($PSCmdlet.ShouldProcess($ServiceName,
            "Set rotate files")) {
            nssm set $ServiceName AppRotateFiles 1
        }
    }
    
    if ($PSCmdlet.ShouldProcess($ServiceName,
        "Rotate bytes $RotateBytes")) {
        nssm set $ServiceName AppRotateBytes $RotateBytes
    }

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