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: $_" } } |