我有一个任务,它会在一系列服务器上检查占用CPU时间超过5分钟的指定windows进程。
进程和服务器是通过数组提供的,并通过一些循环循环,这很好地工作。
然而,我想要做的是计算每个进程在循环过程中找到了多少结果。
在本例中,设置的变量为
$seconds = 300
$server = "SERVER1"
$process = "notepad.exe"我运行的命令如下所示
$list = (Invoke-Command -ComputerName $server -ScriptBlock {
Param($Rseconds, $Rprocess)
Get-Process | Where {
($_.CPU -gt $Rseconds) -and
($_.Path -like "*$Rprocess”)
} | ForEach-Object {
$_.Kill()
}
} -ArgumentList $seconds, $process)就终止进程而言,它工作得很好,并且尊重输入的值,但我不能让它做的是计算它杀死了多少个进程
我已经尝试在ForEach-Object块中简单地递增计数器,并尝试在不同的位置粘贴Measure-Object以尝试并返回值,因此我可以调用如下内容
$list.Count但似乎什么都不起作用。它只是返回一个空值。
发布于 2019-08-21 22:33:12
使用带有参数-PassThru的Stop-Process,而不是在循环中调用Kill()。
$list = Invoke-Command -ComputerName $server -ScriptBlock {
Param($Rseconds, $Rprocess)
Get-Process | Where-Object {
$_.CPU -gt $Rseconds -and
$_.Path -like "*$Rprocess"
} | Stop-Process -Force -PassThru
} -ArgumentList $seconds, $process如果您只想返回计数而不是process对象的列表,则可以执行以下操作:
$list = Invoke-Command -ComputerName $server -ScriptBlock {
Param($Rseconds, $Rprocess)
$proc = Get-Process | Where-Object {
$_.CPU -gt $Rseconds -and
$_.Path -like "*$Rprocess"
}
$proc | Stop-Process -Force
$proc.Count
} -ArgumentList $seconds, $process发布于 2019-08-21 23:05:25
找到了答案
$listCount = (Invoke-Command -ComputerName $server -ScriptBlock { param($Rseconds,$Rprocess) Get-Process | Where { ($_.CPU -gt $Rseconds) -and ($_.Path -like "*$Rprocess”) } | Measure-Object } -ArgumentList $seconds,$process)我不得不添加Measure-Object,但我也被我自己的设置欺骗了。我将服务器范围限制在一台服务器上,但我检查错了一台服务器,因此我走进了一条死胡同,似乎我以前已经有了解决方案
现在全部正常工作
https://stackoverflow.com/questions/57593597
复制相似问题