如何 运行 将 PowerShell 脚本作为服务?

How do I run a PowerShell script as a service?

我创建了下面的脚本来检查我的应用程序的端口 2025 并记录连接数。

我需要此脚本 运行 作为 Windows 上的一项服务,名称为 netstat_2025。有谁知道有没有这种可能?

我不想使用任务计划程序,而是 运行 Windows 上的脚本即服务。

脚本 SCTT521CTO.ps1

$startTime =  (Get-Date).ToString("dd_MM_yyyy")
$LogDate = ((get-date).ToLocalTime()).ToString("yyyy-MM-ddTHH:mm:ss.fff")
$hostname = hostname

$portTServer = 8000
$FileTserver = netstat -ano | findstr "8000"

$LogTserver = $LogDate + " - Quantidade de Conexoes na porta " + $portTServer + ": " + $FileTserver.count + " - Servidor: " + $hostname
$LogTserver | Out-File -Append D:\SCTT521CTO\netstat_$startTime.log

$limit = (Get-Date).AddDays(-5)
$path = "D:\SCTT521CTO\*"
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

脚本服务。ps1

# Desired name of the service
$serviceName = 'netstat_2025'

# Get the full path to powershell.exe
$powershellPath = ( Get-Command powershell ).Source

# The path to the script you want to run as a service
$serviceScriptPath = D:\scripts\SCTT521CTO.ps1

# The arguments to pass to the powershell executable each time the service starts
$args = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $serviceScriptPath

# Install the service using nssm
nssm install $serviceName $powershellPath $args

# See that the service is registered and check its status
Get-Service $serviceName

我原来的回答没有考虑到您仍然需要实现服务控制接口,powershell.exe 没有实现。不过,我确实研究了其他一些 运行 将 PowerShell 脚本作为服务的方法。

我遇到的可以为您执行此操作的更简单的工具之一是 nssm 您可以使用 nssm (Non-Sucking Service Manager) 注册新服务并将其 运行 作为您的 PowerShell 脚本。您需要确保您的 脚本的主要逻辑 运行 处于无限循环 中(就像大多数长 运行ning 程序或服务所做的那样),然后您可以使用 nssm 注册一个新服务,该服务将 运行 您的 PowerShell 脚本。下面是将代码放入不终止的主循环的示例:

while( $true ) {
  $startTime =  (Get-Date).ToString("dd_MM_yyyy")
  $LogDate = ((get-date).ToLocalTime()).ToString("yyyy-MM-ddTHH:mm:ss.fff")
  $hostname = hostname

  $portTServer = 8000
  $FileTserver = netstat -ano | findstr "8000"

  $LogTserver = $LogDate + " - Quantidade de Conexoes na porta " + $portTServer + ": " + $FileTserver.count + " - Servidor: " + $hostname
  $LogTserver | Out-File -Append D:\SCTT521CTO\netstat_$startTime.log

  $limit = (Get-Date).AddDays(-5)
  $path = "D:\SCTT521CTO\*"
  Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

  # Add a sleep at the end of the loop to prevent the script from eating
  # too much CPU time
  Start-Sleep -Seconds 60
}

要将您的脚本注册为 PowerShell 服务,您可以使用以下 PowerShell 代码(请注意,如果您使用 Chocolatey 安装,nssm 将已经在 PATH 上,不知道是不是你手动安装的时候):

# Desired name of the service
$serviceName = 'netstat_2025'

# Get the full path to powershell.exe
$powershellPath = ( Get-Command powershell ).Source

# The path to the script you want to run as a service
$serviceScriptPath = C:\path\to\service\script.ps1

# The arguments to pass to the powershell executable each time the service starts
$args = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $serviceScriptPath

# Install the service using nssm
nssm install $serviceName $powershellPath $args

# See that the service is registered and check its status
Get-Service $serviceName

您的服务现在应该已安装,并且可以像任何其他 Windows 服务一样进行控制。它的工作方式不是直接将 powershell.exe 注册为服务,而是将 nssm.exe 注册为服务可执行文件, 确实 实现了正确的服务控制处理程序,然后 运行s 您为该服务配置的任何程序(在本例中,使用 powershell.exe 调用您的脚本)。

您可以从 nssm.cc 他们那里下载 NSSM:

  1. 运行 命令行中的 nssm:nssm install YourServiceName

  2. 设置信息:

  • 路径:Powershell 路径
  • 启动目录:你的脚本目录
  • 选项:.\yourscript.ps1 -arg1 值 -arg2 值 -arg3 值

就是这样。