我拥有计算机的管理员权限。我有一个使用 nssm.exe 创建为服务的单行 .ps1,当此 ps1 位于
C:\test
中时,它就可以工作。 (以本地系统帐户登录)
当相同的 .ps1 驻留在
C:\Program Files\WindowsPowerShell\Modules\test
中时,该服务一旦创建将不会运行。它说它无法启动,但事件查看器中除了暂停之外没有任何内容。
权限对我来说看起来不错。我有完全访问权限。
尝试使用
nssm.exe
为 .ps1
脚本创建服务,这应该让我运行该服务,但它暂停了
nssm.exe
不幸的是,在其nssm install
命令中不保留传递参数之间的边界,并且简单地用空格连接参数值 - 可能会在写入时删除语法
"
字符注册中心的服务定义。[1]
虽然避免包含空格的参数是一种解决方法 - 例如使用文件路径的短版本 (8.3) - 但这种解决方法并不总是一种选择。
因此,您必须 使用 embedded
"
- 以 \"
的形式进行引用(作为参数 value 的一部分),以便以将参数保留为不同的方式传递带有空格的参数 论据:
如何实现取决于您调用nssm.exe
的PowerShell版本(有关背景信息,请参阅此答案):
Windows PowerShell 和 PowerShell (Core) 7+ 直至 v7.2x 调用时:
\"
PowerShell 7.3+ 调用时:
"
- PowerShell 将为您在进程命令行上传递
\"
。
#requires -RunAsAdministrator
# Get the PowerShell executable's full path.
$Binary = (Get-Process -Id $PID).Path
# Set the *.ps1 file's full path:
$File = 'C:\Program Files\WindowsPowerShell\Modules\PoshBot\0.12.0\Test-service.ps1'
# Install the service and for simplicity pass the
# the pass-through arguments as a single string, and
# use embedded quoting around arguments that do/may contain spaces.
& $PSScriptRoot\nssm.exe install Poshbot $Binary @"
-ExecutionPolicy Bypass -NoProfile -File $(("\`"$File\`"", "`"$File`"")[[bool] $IsCoreClr])
"@
[1] 此类传递参数存储在目标服务定义的 AppParameters
子项的
Parameters
值中,该值本身就是
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
的子项