powershell和x27之间有什么区别;一站式服务和一站式服务
在powershell中,我看到了多种停止服务的方法 更现代的方式powershell和x27之间有什么区别;一站式服务和一站式服务,powershell,Powershell,在powershell中,我看到了多种停止服务的方法 更现代的方式 Stop-Service wuauserv 还有更传统的方式 NET STOP WUAUSERV 传统方式 我有powershell脚本,可以使用packer构建windows golden images。最初使用的脚本NET STOP。我发现,一旦切换到停止服务,在安装windows更新后重新启动VM时,我似乎会更频繁地出现故障 停止服务和净停止是否产生相同的结果?或者,它们之间是否存在差异,这或许可以解释为什么遗留版本看
Stop-Service wuauserv
还有更传统的方式
NET STOP WUAUSERV
传统方式
我有powershell脚本,可以使用packer构建windows golden images。最初使用的脚本NET STOP
。我发现,一旦切换到停止服务
,在安装windows更新后重新启动VM时,我似乎会更频繁地出现故障
停止服务
和净停止
是否产生相同的结果?或者,它们之间是否存在差异,这或许可以解释为什么遗留版本看起来更可靠 差异正在等待服务实际停止<代码>网络停止服务等待服务停止,或者至少发送事件,表明它现在“停止”。sc停止服务的“其他传统”方式在发送停止信号后立即退出,并转储当前服务状态,该状态通常为stop\u PENDING
Stop Service
cmdlet确实会等待服务停止,但可能存在服务停止时间过长且cmdlet退出的情况,或者其中有一个-nowait
开关。此外,如果需要,还会重新启动一些服务,因此可能需要进行进一步检查,例如(如果服务未停止):
对于以下Windows服务:
- 当前运行
- 原则上是可以停止的
净止点
应动作相同,即同步:
也就是说,它们向指定的服务发送停止请求并等待停止完成(净停止
总是等待,而在PSv5+中,您可以使用停止服务
的-NoWait
开关选择不等待)
与净停止
(如果服务已停止,则报告错误)不同,停止服务
是幂等的(显示所需的状态逻辑):如果目标服务已处于停止状态,则该命令是安静的no-op
(顺便提一下:启动服务
也是同步的,但始终是同步的,并且也是幂等的。)
应与停止服务相同,但以下情况除外:
- 与
不同,它不支持停止服务
来停止依赖于正在运行的服务(依赖于正在停止的服务的其他服务)-Force
- 由于您甚至无法停止依赖于其他服务的服务(!)
- 实际上,从Windows PowerShell v5.1/PowerShell Core v6.0-rc开始,您只能停止具有
的服务,这些服务既没有依赖项(没有依赖于它们的服务),也不依赖于其他服务Set Service-Status Stopped
可选阅读:查看
停止服务
和启动服务
源代码:
GitHub上公开的源代码是针对PowerShell的跨平台核心版的,但看起来所讨论的代码基本上是从Windows PowerShell版本中未经修改获取的
:该[1] ,仅当明确指定了停止服务
开关时,才会绕过该选项,在这种情况下,变量-NoWait
设置为waitforserviceostop
false
:启动启动服务
[1] 如果达到目标状态,等待循环在继续等待时发出警告(每2秒一次);如果服务意外地处于目标状态挂起状态或目标状态,则只等待错误中止。我会认为它们是可互换的。我建议的主要事情是围绕调用编写一些逻辑代码,以验证服务是否已实际停止。如果停止请求失败,您可以重试几次,并在必要时最终终止该进程。现在的“更传统”是“sc-stop”而不是“net-stop”,但从技术上讲,如果您在Powershell中,请尽可能使用cmdlet。然而,有些事情在PS中无法解决,但是您通常可以解析输出以获得更改内容的信息。呃,请仔细检查
DoWaitForStatus
实现。尽管有注释,它仍会等待服务状态达到目标2秒钟。引发超时异常后,如果服务处于目标或挂起状态,它将写入警告。没有timeout参数的API版本将无限期等待,但我怀疑在添加超时后注释没有更新。(感谢您查找代码。我曾经管理过在代码中留下姓名的开发人员。:)啊,我们开始了——特例又回来了。我想我记得有一个服务没有在2秒钟内达到挂起状态,因此失败了。我的身体(显然还有思想)在度假,所以谢谢你检查我的数学。该函数的总体摘要是正确的。做得好(+1)。
Stop-Service $servicename
$sleep=0
$s="Running"
do {
$sleep++
start-sleep 1
$s=(get-service $servicename).status
} while (($s -ne "Stopped") -and ($sleep -le 20))