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

Las*_*Cat 3 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

问题是,它只在检查一个进程时就像上面的代码一样,但是当你尝试检查进程列表时却没有.

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

$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
        }
Run Code Online (Sandbox Code Playgroud)

他们都输出fai1ed.

如果我一个接一个地做,每个不同的过程都将返回runn1ng,只是所有人聚在一起他们返回fai1ed.

附注(如果有人想知道):

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

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

是什么原因导致它以及如何重写它?

Pat*_*cke 5

答案

if (($FoundProcesses | Select-Object -ExpandProperty Name) -contains $Item) {
Run Code Online (Sandbox Code Playgroud)

为什么

PowerShell 3添加了一个名为member enumeration的东西.如果在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
        }
    }
Run Code Online (Sandbox Code Playgroud)