什么是PowerShell的Stop-Service和NET-STOP之间的区别

spu*_*der 3 powershell

在powershell中,我已经看到了多种停止服务的方法

更现代的方式

Stop-Service wuauserv
Run Code Online (Sandbox Code Playgroud)

更传统的方式

NET STOP WUAUSERV
Run Code Online (Sandbox Code Playgroud)

遗留方式自动化要困难得多,因为它本身不是幂等的.

我有powershell脚本,使用packer构建windows黄金映像.最初使用的脚本NET STOP.我发现,一旦切换到Stop-Service,在安装Windows更新后重启VM时,我似乎会遇到更频繁的故障.

同时做两个Stop-ServiceNET STOP产生相同的结果?或者它们之间是否有差异可以解释为什么遗留的似乎更可靠?

mkl*_*nt0 5

对于Windows服务:

  • 目前正在运行
  • 原则上可以停止

双方net stopStop-Service应采取行动相同,即同步:

也就是说,它们发送指定服务停止请求,并等待停止完成(net stop 总是等待,同时,在PSv5 +,你可以选择退出与等待Stop-Service-NoWait切换).

net stop(如果服务已经停止时报告错误)不同,Stop-Service幂等的(展示期望状态逻辑):如果目标服务已经处于停止状态,则命令是安静的无操作.

(顺便说一句:Start-Service也是同步的,但总是如此,也是幂等的.)


Set-Service -Status Stopped 应该采取相同的行动Stop-Service,除了:

  • 不同的是Stop-Service,它不支持-Force为了停止运行依赖的服务(依赖于服务被停止的其他服务).

  • 由于我认为是一个bug,你甚至无法停止自己依赖其他服务的服务(!).

  • 实际上,从Windows PowerShell v5.1/PowerShell Core v6.0-rc开始,您只能停止Set-Service -Status Stopped没有依赖项的服务(没有依赖它们的服务),也不能依赖其他服务.


可选阅读:查看Stop-ServiceStart-Service源代码:

GitHub上的公开源代码是针对PowerShell 的跨平台核心版本,但看起来有问题的代码基本上是从Windows PowerShell版本中未经修改的.


[1]如果达到目标状态的时间超过2秒,等待循环会发出警告( 2秒钟),同时继续等待 ; 等待仅中止错误,如果服务是出乎意料既不在目标状态- 未决状态也不在目标状态.