Скрипт процесса получения Powershell не работает правильно - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу, чтобы этот скрипт показывал мне процессы WinWord, которые выполняются в данный момент, и отправлял оповещение по электронной почте. В настоящее время 1-й сценарий работает, если есть запущенные процессы WinWord, и перечисляет их в электронном письме, НО, если они не являются процессами WinWord, выполняющими сценарий, происходит сбой, сообщая, что параметр пуст или пуст, не может найти процесс.

Второй сценарий работает, если нет никаких процессов и не выдает пустой или нулевой параметр, если нет запущенных процессов WinWord, а только показывает true или false по электронной почте. Не список запущенных процессов. Также хотел бы добавить хост записи в скрипт для вывода электронной почты, чтобы сказать. Ниже приведено количество запущенных процессов WinWord.

Я новичок ie в PowerShell. Я учусь как я go. Я также использовал -erroraction silentlycontinue для первого сценария, но при выводе на электронную почту он по-прежнему завершается с пустым или нулевым параметром.

Ниже приведены сценарии.

Не работает, если процесс не запущен, не может принять аргумент, который является нулевым или пустым. Если процесс работает идеально.

$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

Работает, если аргумент нулевой или пустой, но отсутствует оповещение по электронной почте, в котором говорится, что 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

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

вы можете использовать ErrorAction как silentlyContinue, который заставит ваш скрипт работать, даже если есть ошибка «НЕТ экземпляров 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
0 голосов
/ 22 апреля 2020

Вы имеете правильную идею, используя where-object, чтобы ограничить процессы только тем именем, которое вы хотите. Лог c, который вы используете для счетчика больше нуля, вернет логическое значение ($ 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
...