Powershell 获取进程脚本无法正常工作

Powershell get process script not working correctly

我希望此脚本向我显示当前 运行 的 WinWord 进程并发送电子邮件警报。目前,如果有 WinWord 进程,第一个脚本可以工作 运行 并在电子邮件中列出它们,但如果它们没有 WinWord 进程 运行 脚本失败,建议参数为空或 null,找不到进程。

第二个脚本在没有进程时有效,如果没有 WinWord 进程则不会抛出 null 或空参数 运行 但仅通过电子邮件显示 true 或 false。不是进程列表 运行。还想在脚本中为电子邮件输出添加一些写主机。以下是 WinWord 的进程数 运行。

我是 PowerShell 的新手。我边走边学。我还在第一个脚本中使用了 -erroraction silentlycontinue,但是当输出到电子邮件时,它仍然失败,参数为空或空。

以下是脚本。

如果进程不是 运行,则不起作用,不能接受 null 或空的参数。如果进程 运行 完美。

$winwords = (get-process -ComputerName Dummyserver -Name Winword |where-object { $_.Count -gt 0})| Out-String

Send-MailMessage -To "Dummyemail.co.uk" -From " Dummyemail.co.uk" -Subject "WinWord Check" -SmtpServer " Dummy.priv" -Body $winwords

如果参数为 null 或为空但已发出电子邮件警报,显示 false 或 true 但不会像第一个脚本那样显示进程数 运行,则工作正常。

$processname = "Winword"
$instanceisrunning = (get-process -ComputerName Dummyserver| where-object { $_.Name -eq $processname }).count -gt 0 | Out-String

Send-MailMessage -To "Dummyemail co.uk" -From "Dummyemail.co.uk" -Subject "WinWord Check" -SmtpServer " Dummyemail.priv" -Body $isrunning

您的想法是正确的,使用 where-object 将进程限制为您想要的名称。您用于计数大于零的逻辑将 return 一个布尔值($true 或 $false),这就是您看到该输出的原因。

如果您想在 运行 时始终发送消息,您可以这样做:

$instances = (get-process -ComputerName Dummyserver | where-object { $_.Name -eq $processname })

if($instances.count -gt 0)
{
   $message = $instances | Out-String
}
else
{
   $message = "No instances running"
}

Send-MailMessage -To "Dummyemail co.uk" -From "Dummyemail.co.uk" -Subject "WinWord Check" -SmtpServer " Dummyemail.priv" -Body $message

如果您只想在实例 运行ning 时发送消息:

$instances = (get-process -ComputerName Dummyserver | where-object { $_.Name -eq $processname })

if($instances.count -gt 0)
{
   Send-MailMessage -To "Dummyemail co.uk" -From "Dummyemail.co.uk" -Subject "WinWord Check" -SmtpServer " Dummyemail.priv" -Body ($instances | Out-String)
}

编辑:使用一封电子邮件将代码添加到多台计算机的工作

$computers = @("dummyserver","otherserver","nextserver")

$processName = "WinWord"

$message = "$processName is running on the following:"

foreach ($computer in $computers)
{
    $message += "Hostname: $computer"

    $instances = (Get-Process -ComputerName $computers | Where-Object { $_.Name -eq $processName })

    if($instances.count -gt 0)
    {
       $message += ($instances | Out-String)
    }
    else
    {
       $message += "No instances running"
    }
}

Send-MailMessage -To "Dummyemail co.uk" -From "Dummyemail.co.uk" -Subject "WinWord Check" -SmtpServer " Dummyemail.priv" -Body $message

您可以将 ErrorAction 用作 silentlyContinue,这将使您的脚本 运行 即使出现错误 "NO Winword instances".

$winwords = (get-process -ComputerName Dummyserver -Name Winword -ErrorAction 
SilentlyContinue |where-object { $_.Count -gt 0})| Out-String

if($winwords -eq ""){
    $winwords = "No Instances"
}

Send-MailMessage -To "Dummyemail.co.uk" -From " Dummyemail.co.uk" -Subject "WinWord 
Check" -SmtpServer " Dummy.priv" -Body $winwords