【问题标题】:What is wrong with this if condition in powershell?如果 powershell 中的条件有什么问题?
【发布时间】:2021-11-08 13:50:08
【问题描述】:

我正在尝试查找正在运行的服务,同时检查我的机器中是否存在正确的版本及更高版本,如果是,那么我需要返回 1 否则为零

我需要检查

条件 1:$servicestatus = true

Condition 2 : Where Status -ne "Running" = true

条件 3:Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall* | 选择对象 DisplayName、DisplayVersion、Publisher、InstallDate | Where-Object {$.DisplayName -like "Crow*" -and $.DisplayVersion -gt 6.28} 命令至少要有 1 条记录

然后退出1

如果条件3没有记录则退出0

问题

但是当

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall* |选择对象 DisplayName、DisplayVersion、Publisher、InstallDate | Where-Object {$.DisplayName -like "Crow*" -and $.DisplayVersion -gt 6.28} 结果是否有记录,那么整个代码就是结果 1

但是当没有记录导致第三种情况时,我期望为零

请帮忙:这是我写的完整代码

$servicestatus = get-service 'something'
If (@($servicestatus | Where Status -ne "Running" | Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Where-Object {$_.DisplayName -like "Crow*" -and $_.DisplayVersion -gt 6.28}).Count -gt 0)
    {
        echo "1"
       Exit 1
       
    }
Else
    {
        echo "1"
       Exit 0
    }

我修改了代码以添加一个和条件,但仍然没有运气

$servicestatus = get-service 'something'
If (@(($servicestatus | Where Status -ne "Running" ) -and (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate  | Where {($_.DisplayName -like "Crow*") -and ($_.DisplayVersion -gt 6.28)})).Count -gt 0)
    {
        echo "1"
       Exit 1
       
    }
Else
    {
        echo "1"
       Exit 0
    }

【问题讨论】:

  • 请澄清:(C1 or C2) and C3C1 or (C2 and C3)
  • (C1 或 C2)和 C3
  • 对不起,我在这两个地方都回显 1 很抱歉:D

标签: powershell conditional-statements logic powershell-2.0


【解决方案1】:

这有时很奇怪,但您可能希望在括号中设置以-and-or 等分隔的每个条件,如下所示:

| Where {($_.DisplayName -like "Crow*") -and ($_.DisplayVersion -gt 6.28)}

据我所知原因是powershell认为-and是前一个表达式的参数(本例中为字符串)。

要编辑的代码:

试试这个:

if(($servicestatus.Status -ne "Running") -and ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Where-Object {($_.DisplayName -like "Crow*") -and ($_.DisplayVersion -gt 6.28)}).Count -gt 0))

【讨论】:

  • If (@($servicestatus | Where Status -ne "Running" | Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher,安装日期 | 其中 {($_.DisplayName -like "Crow*") -and ($_.DisplayVersion -gt 6.28)}).Count -gt 0)
  • 我认为您对$servicestatus | Where Status -ne "Running" | Get-ItemProperty 的解释也存在错误。如果服务未运行,您想检查 HKLM 中是否有东西,对吗?
  • 看起来问题是因为我把 or 而不是 and 在第三个条件下
  • 我试过这个 If (@(($servicestatus | Where Status -ne "Running" ) -and (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-对象 DisplayName、DisplayVersion、Publisher、InstallDate | Where {($_.DisplayName -like "Crow*") -and ($_.DisplayVersion -gt 6.28)})).Count -gt 0) 但仍然无法正常工作
  • (C1 或 C2)和 C3
猜你喜欢
  • 2021-04-05
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2015-04-06
  • 2014-01-02
相关资源
最近更新 更多