【问题标题】:Loop is duplicating output循环正在复制输出
【发布时间】:2017-07-16 19:48:37
【问题描述】:

下面的代码旨在检查两个硬编码的服务名称(它们永远不会改变),如果没有找到,则说明服务不存在。它会这样做,但会输出两行,因为有两个服务要检查。

有没有办法改变这一点,以便在检查两个服务后只给出一个输出?

$servicenames = ("Service 1", "Service 2")

Write-Host 'Checking for  Services'

function servicevalidation {
  foreach ($sn in $servicenames) {
    if ((Get-Service "$servicenames*" -Include $servicenames) -eq $null) {
      Write-Host 'Young jedi you are mistaken, this server is not a collector!'
    } else {
      Write-Host "$servicenames present"
    }
  }
}

【问题讨论】:

  • 您不能将服务名称与包含选项一起使用,请参阅documentation。我确定你想检查这个条件if ((Get-Service $sn) -eq $null)

标签: arrays loops powershell foreach


【解决方案1】:

Get-Service 接受服务列表,因此您可以简单地执行以下操作而无需循环。不过,如果您将检查封装在一个函数中,我建议您将服务作为参数传递。

function servicevalidation($svc) {
  if (Get-Service $svc -ErrorAction SilentlyContinue) {
    Write-Host 'Young jedi you are mistaken, this server is not a collector!'
  } else {
    Write-Host "$svc present."
  }
}

servicevalidation $servicenames

-ErrorAction SilentlyContinue 会在服务不存在的情况下抑制错误输出。

如果您想知道究竟缺少哪个服务,可以使用Where-Object 过滤器:

function servicevalidation($svc) {
  $missing = $svc | Where-Object {
    -not (Get-Service $_ -ErrorAction SilentlyContinue)
  }

  if ($missing) {
    Write-Host "missing service: $missing"
  } else {
    Write-Host "$svc present."
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2019-02-17
    • 2015-11-27
    • 2016-02-03
    • 2017-10-25
    相关资源
    最近更新 更多