Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
powershell和x27之间有什么区别;一站式服务和一站式服务_Powershell - Fatal编程技术网

powershell和x27之间有什么区别;一站式服务和一站式服务

powershell和x27之间有什么区别;一站式服务和一站式服务,powershell,Powershell,在powershell中,我看到了多种停止服务的方法 更现代的方式 Stop-Service wuauserv 还有更传统的方式 NET STOP WUAUSERV 传统方式 我有powershell脚本,可以使用packer构建windows golden images。最初使用的脚本NET STOP。我发现,一旦切换到停止服务,在安装windows更新后重新启动VM时,我似乎会更频繁地出现故障 停止服务和净停止是否产生相同的结果?或者,它们之间是否存在差异,这或许可以解释为什么遗留版本看

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

更现代的方式

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))