1

提前致谢。

这是我们正在运行的 Powershell4 脚本:

$process = Get-WMiObject Win32_Service -Filter "Name ='HotKeyService'" 
write-host Process Name = $process.name
write-host Process ID = $process.processid

$oopid = $process.processid
stop-process -id $oopid -force
wait-process -id $oopid -timeout 60 -WarningAction SilentlyContinue
-------------------------------
working directory: C:\Program Files\HK\HK.HotKeyService

有了这个,我得到:

Process Name = HotKeyService
Process ID = 0

错误#1

停止进程:由于以下错误,无法停止进程“空闲(0)”
:访问被拒绝在 C:\Windows\TEMP\tmp206027652026805712.ps1:6 char:1 + stop-process -id $oopid -force + ~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (System.Diagnostics.Process (Idle):Process) [停止-进程],ProcessCommandException + FullyQualifiedErrorId : CouldNotStopProcess,Microsoft.PowerShell.Command s.StopProcessCommand

错误#2

wait-process :此命令停止操作,因为它无法等待“系统空闲”进程。指定另一个进程并再次运行您的命令。在 C:\Windows\TEMP\tmp206027652026805712.ps1:7 char:1 + 等待进程 -id $oopid -timeout 60 -WarningAction SilentlyContinue + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo :ObjectNotFound:(System.Diagnostics.Process
(Idl e):Process)[Wait-Process],ProcessCommandException + FullyQualifiedErrorId:WaitOnIdleProcess,Microsoft.PowerShell.Commands。等待进程命令

===============================
command exit code: 0

上面的代码是在 Windows 2012 服务器和 Win 7 工作站上的许多服务上运行的更大进程的一部分。有时虽然它失败了,我不知道为什么。在这种情况下,检索到正确的服务名称,可以在命令 ouptut 中看到,但 PID 为 0,这不可能是正确的,因为那是系统空闲进程的 PID。

调用此 PS 脚本的父软件稍后显示 HotKey 安装文件夹中的文件无法更新,因为“(该进程无法访问该文件,因为它正在被另一个进程使用)”,这是有道理的,因为 HotKeyService 服务没有正确停止。

我再次运行父软件,它在同一服务上正常工作。

我的问题是 Get-WMIObject 如何返回正确的服务名称,但在下一步显示 PID 为零?我想不通这个。

感谢您的帮助。凯杰

4

1 回答 1

2

当您看到一个值为 的Win32_Service实例时,它仅仅意味着该服务没有运行。ProcessId0

你会发现:

(Get-WMiObject Win32_Service -Filter "Name ='HotKeyService'").State

Stopped

于 2017-10-31T13:43:30.053 回答