无法从特定目录将 test .ps1 作为服务运行

问题描述 投票:0回答:1

我拥有计算机的管理员权限。我有一个使用 nssm.exe 创建为服务的单行 .ps1,当此 ps1 位于

C:\test
中时,它就可以工作。 (以本地系统帐户登录)

当相同的 .ps1 驻留在

C:\Program Files\WindowsPowerShell\Modules\test
中时,该服务一旦创建将不会运行。它说它无法启动,但事件查看器中除了暂停之外没有任何内容。

权限对我来说看起来不错。我有完全访问权限。

尝试使用

nssm.exe
.ps1
脚本创建服务,这应该让我运行该服务,但它暂停了

powershell parameter-passing nssm
1个回答
0
投票
不幸的是,

nssm.exe
不幸的是,在其nssm install
命令中不保留传递参数
之间的边界,并且简单地用空格连接参数值 - 可能会在写入时删除语法
"
字符注册中心的服务定义。[1]

虽然避免包含空格的参数是一种解决方法 - 例如使用文件路径的短版本 (8.3) - 但这种解决方法并不总是一种选择。

因此,您必须 使用 embedded

"
- 以
\"
的形式进行引用(作为参数 value 的一部分),以便以将参数保留为不同的方式传递带有空格的参数 论据:

如何实现取决于您调用nssm.exe

的PowerShell版本(有关背景信息,请参阅
此答案):

  • Windows PowerShellPowerShell (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
 
的子项

© www.soinside.com 2019 - 2024. All rights reserved.