powershell - 在 PowerShell 版本 2 中检查进程和进程状态并根据单个进程或多个进程获得两个不同的输出?

标签 powershell powershell-2.0

下面是我使用的代码:

$ProcessesToCheckFor = (
    'company_name_uat-Historian'
    )

$FoundProcesses = Get-Process -Name $ProcessesToCheckFor -ErrorAction SilentlyContinue

foreach ($Item in $ProcessesToCheckFor)
    {
    if ($FoundProcesses.Name -contains $Item)
        {
        '{0} runn1ng' -f $Item
        }
        else
        {
        '{0} fai1ed' -f $Item
        }
    }

代码检查company_name_uat-Historian 进程是否正在服务器上运行,如果正在运行,它将输出runn1ngfail1ed如果没有。

问题是,就像上面的代码一样,它只检查一个进程时有效,但当您尝试检查进程列表时则无效。

我需要检查进程列表,所以当我按如下所示链接其余进程时:

$ProcessesToCheckFor = (
'company_name_uat-Historian',
'company_name_uat-KEReviewCollector',
'company_name_uat-lwm',
'company_name_uat-MQAck',
'company_name_uat-MQOutput',
'company_name_uat-SQAC',
'company_name_uat-Store',
'company_name_uat-Store_STS',
'company_name_uat-StoreLegacy',
'spotify'
    )

$FoundProcesses = Get-Process -Name $ProcessesToCheckFor -ErrorAction SilentlyContinue

foreach ($Item in $ProcessesToCheckFor)
    {
    if ($FoundProcesses.Name -contains $Item)
        {
        '{0} runn1ng' -f $Item
        }
        else
        {
        '{0} fai1ed' -f $Item
        }

它们都输出fail1ed

如果我一个一个地执行它们,每个不同的进程将返回 runn1ng,只是全部聚集在一起它们返回 fail1ed

旁注(如果有人想知道的话):

  • runn1ngfai1ed 是使用 JavaScript 被图像替换的“代码字”。我正在制作一个 HTML 仪表板来监控我的 Windows 服务器的工作情况,所以想想绿色复选标记和红色 x 标记等等。
  • 使用 PowerShell 版本 2 根本不是我的选择,我负责监控的一些服务器是 Windows 2008 R2。我相信它们会在今年某个时候更新,但项目可交付成果要求我立即制定监控解决方案。还有一些 2012 年的服务器,我喜欢为其编写 PowerShell 脚本。
  • spotify 被列为一个进程,因为我知道它是一个合法的进程,但没有安装在我们的服务器上。当我编写脚本时,我最初在自己的个人计算机上进行了测试,并使用 spotify 作为测试 runn1ng 是否打开或 fail1ed 如果我关闭它。如果我的所有进程都在 runn1ng 并且 spotify 是 fail1ed,那么这表明 PS 代码正在运行。

它似乎发生在 PowerShell 版本 2 中。

任何想法是什么导致它以及我如何重写它?

最佳答案

答案

if (($FoundProcesses | Select-Object -ExpandProperty Name) -contains $Item) {

为什么

PowerShell 3 添加了称为成员枚举的东西。如果在 2.0 中有对象数组,则不能直接调用数组的属性,因为它会在数组对象本身上查找那些属性。在 3.0+ 中,如果数组中不存在该成员,它也会检查该成员的项目。使用 Select-Object -ExpandProperty 是调用成员的更明确的方式。

您也可以将 Get-Process 调用移动到 foreach 循环中。

foreach ($Item in $ProcessesToCheckFor)
    {
    if (Get-Process -Name $Item -ErrorAction SilentlyContinue)
        {
        '{0} runn1ng' -f $Item
        }
        else
        {
        '{0} fai1ed' -f $Item
        }
    }

关于powershell - 在 PowerShell 版本 2 中检查进程和进程状态并根据单个进程或多个进程获得两个不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45314884/

相关文章:

windows - 如何递归遍历文件夹并确定文件夹大小?

azure - 在 PowerShell Runbook 中使用 Azure 文件共享

.net - 使用systemdiagnostics.process在Powershell中运行后台作业

c++ - 需要用 C++ 检查 Exchange 服务器的收件箱

powershell - %{ $_.Key1 } 是什么意思?

powershell - Windows Azure 中的 'the current update to this deployment has been preempted' 错误意味着什么?

powershell - DotNet NuGet 推送导致 PowerShell 出现 TLS 错误

powershell - 选择对象省略了选择字符串Powershell的输出

powershell - 如何衡量构建执行时间?

sharepoint - Powershell 错误 "The term ' Get-SPWeb' 未被识别为 cmdlet、函数的名称...”