Powershell 错误处理和获取服务的问题

Powershell 错误处理和获取服务的问题,powershell,powershell-4.0,Powershell,Powershell 4.0,我正试图让Powershell进入 能够远程停止/启动服务。 在运行过程中进行日志记录,以便在需要停止/启动服务时打印出来。 但我遇到的一个大问题是,如果该服务不存在,它会抛出一个巨大的错误。 我仍在编写脚本的其余部分,这将在关闭应用程序方面做很多事情,但我不知道该错误是否意味着脚本的其余部分将无法运行。 还有一个问题,我不知道如何在脚本的第二阶段也使用WriteLog函数。 我可以在IF后面放多个{}节,这样我就可以运行Stop并写入日志了吗 以下代码仅用于停止服务。 是这样, 1.报告服务已

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

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

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

IF(Get Service-ComputerName localhost-Name('ServiceName')| Where对象{$\状态-eq“Stopped”})
{写入主机“'ServiceName'已停止,正在继续…”
埃尔塞夫
(Get Service-ComputerName localhost-Name('ServiceName')|其中对象{$\状态-eq“Running”})
{Get Service-ComputerName localhost-Name('ServiceName')| Stop Service-Force}
埃尔塞夫
(获取服务-ComputerName本地主机-Name('ServiceName')-ErrorAction“Continue”)
{写入主机“'ServiceName'不存在,正在继续…”
现在,这会将找不到服务的错误打印3次。
我明白这是因为它无法在服务被管道传输后进行评估之前获取服务,无论它是否停止。
因此,我认为我使用的方法是完全错误的,但不确定该怎么做。

除了“ServiceName不存在,继续…”之外,我不希望打印任何内容。

以这种方式使用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'
}

以这种方式使用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做更多的研究。除此之外,如果脚本出现错误,那么脚本的其余部分还会继续吗?假设如果它出错,我可以完全跳出,根据它的工作情况,稍后代码中还有一些更关键的点,在那里停止是有用的。当然,完成:)对不起,前面的评论,我一直按enter键,没有意识到它只是添加了注释,没有添加换行符@Khaelas如果在脚本的try部分出现任何错误,它将进入catch部分:),因为服务命令不返回终止错误(这是try/catch所要求的),您可能希望向Stop service命令添加“-ErrorAction Stop”,就像我对第一个Get service命令所做的那样。我会更新我的答案来显示:)啊,非常感谢!我刚刚测试了它,它运行得非常好,我想我会对try/catch做更多的研究。除此之外,如果脚本出现错误,那么脚本的其余部分还会继续吗?假设如果它出错,我可以完全跳出,根据它的工作情况,稍后代码中还有一些更关键的点,在那里停止是有用的。当然,完成:)对不起,前面的评论,我一直按enter键,没有意识到它只是添加了注释,没有添加换行符@Khaelas如果在脚本的try部分出现任何错误,它将进入catch部分:),因为服务命令不返回终止错误(这是try/catch所要求的),您可能希望向Stop service命令添加“-ErrorAction Stop”,就像我对第一个Get service命令所做的那样。我将更新我的答案以显示以下内容:)