计算调用命令的结果



>我有一个作业,它关闭并检查指定的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

最新更新