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

时间:2019-12-30 11:51:21

标签: powershell netstat

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

我需要此脚本作为名称为netstat_2025的Windows上的服务运行。有人知道这种可能性吗?

我不想使用任务计划程序,而是在Windows上将脚本作为服务运行。

$startTime =  (Get-Date).ToString("dd_MM_yyyy")
$LogDate = ((get-date).ToLocalTime()).ToString("yyyy-MM-ddTHH:mm:ss.fff")
$hostname = hostname
$portTServer = 2025
$FileTserver = netstat -ano | findstr "2025"
$LogTserver = $LogDate + " - Quantidade de Conexoes na porta " + $portTServer + ": " + 
$FileTserver.count + " - Servidor: " + $hostname
$LogTserver | Out-File -Append D:\scripts\netstat_$startTime.log

2 个答案:

答案 0 :(得分:1)

使用New-Service创建新服务。这是sc create外部命令的PowerShell本地等效项。在您的情况下,您需要将脚本保存到文件中,然后可以将其配置为通过powershell.exe作为服务运行。至少需要提供服务名称以及要运行的命令:

$pathToServiceScript = 'C:\Path\To\Service-Script.ps1'
New-Service -Name netstat_2025 -BinaryPathName "powershell.exe -f ""$pathToServiceScript"""

-Name将成为服务的名称。如果您想在services.msc中使用更友好的显示名称,还可以提供-DisplayName参数。

-BinaryPathName将成为启动服务时要运行的可执行文件,以及需要传递的所有参数。在这种情况下,我们要运行powershell.exe并执行特定的脚本。我们使用双引号,因此我们可以使用$pathToServiceScript变量,并在路径中有空格的情况下将其用双引号引起来。


如果要控制服务的启动行为,还可以使用-StartupType参数。默认情况下,服务创建为Automatic服务,但您可以指定以下任何启动类型:

  • Boot:指示该服务是由系统加载程序启动的设备驱动程序。此值仅对设备驱动程序有效。 已在PowerShell 6中删除。
  • System:指示该服务是由“ IOInitSystem()”功能启动的设备驱动程序。此值仅对设备驱动程序有效。 已在PowerShell 6中删除。
  • Automatic:默认。在系统启动时,服务已启动或已由操作系统启动。如果自动启动的服务依赖于手动启动的服务,则手动启动的服务也会在系统启动时自动启动。
  • AutomaticDelayedStart:在系统启动后不久开始。
  • Manual:仅由用户,使用服务控制管理器或应用程序手动启动服务。
  • Disabled:服务已禁用,不能由用户或应用程序启动。
  • InvalidValue:不支持该值。使用此值将导致错误。 在PowerShell 6之前不存在。

答案 1 :(得分:1)

您可以直接从nssm.cc下载NSSM:

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

  2. 设置信息:

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

enter image description here

就是这样。