>我有一个作业,它关闭并检查指定的Windows进程,这些进程在一系列服务器上占用了超过5分钟的CPU时间。
进程和服务器通过阵列提供,并通过一些循环进行循环,这很好用。
但是,我想做的是计算每个进程在循环时找到多少结果。
在本例中,设置变量为
$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
但似乎没有任何效果。 它只返回一个空白值。
找到答案
$listCount = (Invoke-Command -ComputerName $server -ScriptBlock { param($Rseconds,$Rprocess) Get-Process | Where { ($_.CPU -gt $Rseconds) -and ($_.Path -like "*$Rprocess”) } | Measure-Object } -ArgumentList $seconds,$process)
不得不添加测量对象,但我也被自己的设置愚弄了。我将服务器范围限制为一台服务器,但我检查了错误的服务器,因此将自己带入了一条死胡同,似乎我以前已经有了解决方案
。现在全部工作
将Stop-Process
与参数-PassThru
一起使用,而不是在循环中调用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
如果您只想返回计数而不是进程对象列表,则可以执行以下操作:
$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