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