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
我希望此脚本向我显示当前 运行 的 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