【问题标题】:Powershell get process script not working correctlyPowershell 获取进程脚本无法正常工作
【发布时间】:2020-08-05 14:07:50
【问题描述】:

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

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

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

以下是脚本。

如果进程没有运行则不起作用,不能接受 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

【问题讨论】:

  • 请用代码格式包装您的代码,以便于阅读。说明链接在您用于创建问题的页面上...

标签: powershell powershell-3.0


【解决方案1】:

您有正确的想法,使用 where-object 将进程限制为您想要的名称。您用于计数大于零的逻辑将返回一个布尔值($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

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

$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

【讨论】:

  • 这很完美。谢谢。我已经为两个不同的服务器复制了两次脚本并收到了两封单独的电子邮件,我希望将它合并为一封电子邮件,是否可以有两个正文?为输出结果。谢谢。
  • 实现第二个服务器的最简单方法是将输出附加到 $message ($message += ($instances | OutString)。
  • 如果这足以回答您的问题,请将其标记为答案。谢谢。
【解决方案2】:

您可以将 ErrorAction 用作静默继续,即使出现“NO Winword 实例”错误,也会使您的脚本运行。

$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

【讨论】:

  • 这也有效。看起来我错过了 if 部分,现在逻辑是有意义的。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2014-12-07
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
相关资源
最近更新 更多