错误处理问题并获得服务

时间:2019-06-18 09:43:32

标签: powershell powershell-4.0

我正在尝试使用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不存在,继续...”

1 个答案:

答案 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'
}