为什么 if 语句在 Powershell 脚本中不起作用?

Why if statement isn't working in Powershell script?

我有一个 VM 运行ning Windows Server 2008 R2 安装了 Zabbix Agent。 我想 运行 一个特定的代码块,如果它是 运行ning。 我手动启动了服务。 当我登录到 VM 时,打开 PowerShell 提示符并输入以下代码片段,它运行良好:

$ZABBIX_INSTALLED = Get-Service "Zabbix Agent"
If ($ZABBIX_INSTALLED) {
   Write-Host "It's running"
}
else {
   Write-Host "Zabbix Agent is not running"
}

问题是当我尝试将其作为脚本调用时,它永远不会 returns 正确,即使进程正常 运行ning(我在任务管理器中检查过)。

关于代码发生了什么的任何建议?感谢您的帮助。

PS:我通过 运行ning Invoke-AzRunCommand 通过 Azure Runbook 传递此脚本并将脚本作为参数传递。

布鲁诺,

此代码将涵盖所有 3 种可能的情况(未安装、未 运行、运行)。

Try {

  $ZABBIX_INSTALLED = (Get-Service "Zabbix Agent" -EA Stop).Status
  
  If ($ZABBIX_INSTALLED -eq "Running") {
     "Zabbix Agent: It's running"
  }
  else {
     "Zabbix Agent: is not running"
  }

} 

Catch {
  "Zabbix Agent: Not Installed!"
}

HTH

这是 if/elseif/else statement/condition 的一个很好的用法:


$serv = Get-Service -Name "Zabbix Agent" -ErrorAction SilentlyContinue
    if($serv.Status -eq "Stopped")
        { Write-Host -Object "Service is Stopped!" -ForegroundColor Yellow } 
         elseif($serv.Status -eq "Running")
            { Write-Host -Object "Service is running!" -ForegroundColor Green }
            else { Write-Host -Object "No service by that name found!" -ForegroundColor Red }

如果服务的状态是停止的,就说它停止了。如果它是 运行,请说它是 运行,如果没有该名称的服务,请说它。

您也可以在 switch 语句中这样做:

try
{
    $srvName = "Zabbix Agent"
    switch  ( ( Get-Service $srvName -ea Stop).Status )
    {
        "Stopped" { "Zabbix Agent: Is not running" }
        "Running"{ "Zabbix Agent: Is running" }
    }
}
catch [Microsoft.PowerShell.Commands.ServiceCommandException]
{
    "Zabbix Agent: Not installed"
}
catch
{
    $_.Exception.Message
}

伙计们,我设法找出并解决了这个问题。

想法是在安装完Zabbix Agent之后,调用一个PS脚本(根据我在问题中写的代码片段)来更新config目录下的配置文件。

因此,当我调用更新脚本时,Get-Service 没有找到该服务,因为出于某种原因它还不可用。

然后我在调用更新脚本之前添加了一个 Start-Sleep 5,它起作用了。