【问题标题】:Problem with error handling and get service错误处理和获取服务的问题
【发布时间】:2019-06-18 18:03:51
【问题描述】:

我正在尝试使用 Powershell;
能够远程停止/启动服务。
随时记录,因此如果需要停止/启动服务,它会打印出来。
但是我遇到的一个大问题是,如果该服务不存在,它会吐出一个巨大的错误。
我仍在编写脚本的其余部分,这将在关闭应用程序方面做很多事情,但我不知道该错误是否意味着脚本的其余部分将无法运行。
还有一个问题是我不确定如何将 WriteLog 函数也放入脚本的第二阶段。
我可以在 IF 之后放置多个 {} 部分,以便我可以运行 Stop 以及写入日志吗?

以下代码仅用于停止服务。
就这样;
1. 报告服务已经停止。
2. 如果不是,请停止它。
- 第 1 步和第 2 步有效,如果有服务,那就是第 3 步,我遇到了问题
3. 如果服务不存在,我希望它继续(因为服务不存在不是问题)但打印出它不存在,因为知道它们可能有用

注意,Write-Log 是一个同时写入物理日志文件和控制台的函数。

IF (Get-Service -ComputerName localhost -Name ('ServiceName') | Where-Object {$_.Status -eq "Stopped"})
    {Write-Host "'ServiceName' is already stopped, proceeding..."}
ELSEIF
    (Get-Service -ComputerName localhost -Name ('ServiceName') | Where-Object {$_.Status -eq "Running"})
    {Get-Service -ComputerName localhost -Name ('ServiceName') | Stop-Service -Force}
ELSEIF 
    (Get-Service -ComputerName localhost -Name ('ServiceName') -ErrorAction "Continue")
    {Write-Host "'ServiceName' doesn't exist, proceeding..."}

现在这会打印出 3 次找不到服务的错误。
我知道这是因为它在通过管道进行评估之前无法获得服务,无论它是否停止。
所以我认为我使用的方法完全错误,但不知道该去哪里。
除了“ServiceName 不存在,正在处理...”之外,我希望什么都不会被打印出来。

【问题讨论】:

    标签: powershell powershell-4.0


    【解决方案1】:

    以这种方式使用 IF 语句很快就会失控。此外,您以不必要的方式多次获得该服务。你最好使用这样的东西:

    try{
        #Getting service - This way the service is only queried once, making the script fast among other things
        $service = Get-Service -Name 'Service Name' -ErrorAction Stop
    
        switch ($service.Status){
            'Stopped'{Write-Host "$($service.Name) is already stopped"}
            'Running'{Stop-Service $service -Force -ErrorAction Stop}
            Default{Write-Host 'Service is neither stopped or running'}
        }
    }catch{
        #Catching errors
        Write-Host 'Error'
    }
    

    【讨论】:

    • 啊,非常感谢!我刚刚对其进行了测试,并且效果非常好,我认为我将对 try/catch 进行更多研究。除此之外,如果出现错误,是否会继续执行脚本的其余部分?据推测,如果它出错,我可以完全跳出来,根据它的工作情况,稍后在代码中还有一些更关键的点,在哪些地方停下来会很有用。
    • 当然,完成 :) 抱歉之前的评论,我一直按回车,没有意识到它只是添加评论而不是添加换行符!
    • @Khaelas 如果在脚本的 try 部分出现任何错误,它将进入 catch 部分:) 由于服务命令不返回终止错误(这是 try/catch 所要求的) 你可能想在 Stop-Service 命令中添加“-ErrorAction Stop”,就像我对第一个 Get-Service 命令所做的那样。我将更新我的答案以显示这一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    • 2012-04-03
    • 2019-01-25
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多