【问题标题】:Why if statement isn't working in Powershell script?为什么 if 语句在 Powershell 脚本中不起作用?
【发布时间】:2021-02-22 23:04:38
【问题描述】:

我有一个运行 Windows Server 2008 R2 并安装了 Zabbix 代理的 VM。 如果它正在运行,我想运行特定的代码块。 我手动启动了服务。 当我登录到 VM 时,打开 PowerShell Prompt 并输入以下 sn-p,它可以正常工作:

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

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

对代码发生了什么有什么建议吗?感谢您的帮助。

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

【问题讨论】:

  • 您显示的代码没有返回任何东西;如果要输出一个布尔值指示服务是否正在运行,请使用[bool] $ZABBIX_INSTALLED
  • @mklement0,如果有对象或值,If ($ZABBIX_INSTALLED) 不会返回 true 吗?我一直都这样使用if ($variable)
  • 它不返回真值。它可以评估为真实条件。如果您想返回 true,请执行 if($variable){$true}else{$false}
  • 我觉得布尔评估不是这里的最佳选择。如果服务存在,即使它没有运行,现有的 if 语句也会触发。可能会更舒服:If ($ZABBIX_INSTALLED.Status -eq 'Running' ) { Write-Host "It's running" }
  • 我认为 OP 意味着 Write-Host "It's running" 永远不会被执行。在我看来,没有找到以“Zabbix Agent”为名称的服务。

标签: powershell windows-server azure-runbook


【解决方案1】:

布鲁诺,

此代码将涵盖所有 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

【讨论】:

  • 嗨@RetiredGeek,感谢您的回答。我试过了,但结果是一样的。结果是当我通过 azure runbook 运行代码时出现 catch 消息,但是当我直接在 VM 内(在 PS 提示符下)运行相同的代码 sn-p 时,结果是 Zabbix Agent 正在运行。
【解决方案2】:

这是if/elseif/else语句/条件的一个很好的用法:


$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 }

如果服务的状态已停止,则说它已停止。如果它正在运行,就说它正在运行,如果没有该名称的服务,就说它。

【讨论】:

  • 似乎您正在尝试查询显示名称,因此请将-Name 参数更改为-DisplayName
【解决方案3】:

你也可以在 swith-statement 中这样做:

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
}

【讨论】:

    【解决方案4】:

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

    想法是在Zabbix Agent安装后,调用PS脚本(基于我在问题中写的代码sn-p)来更新config目录下的配置文件。

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

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

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2021-11-14
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2012-07-21
      • 1970-01-01
      相关资源
      最近更新 更多