#! perl -slw use strict; use warnings; use Win32::Process::Info; use List::Util qw[ sum ]; my $pi = Win32::Process::Info->new; my @pids = $pi->ListPids; my @proc_info; my @fields = qw[ Name WorkingSetSize UserModeTime KernelModeTime ]; my %byPid; while( 1 ) { my @pids = $pi->ListPids; for my $pid ( @pids ) { my @info = $pi->GetProcInfo( { no_user_info => 1 }, $pid ); for my $info ( @info ) { $byPid{ $pid }{ last } = [ @{ $info }{ @fields } ]; } } sleep 1; for my $pid ( @pids ) { my @info = $pi->GetProcInfo( { no_user_info => 1 }, $pid ); for my $info ( @info ) { $byPid{ $pid }{ current } = [ @{ $info }{ @fields } ]; } } my $totalDelta = 0; for my $pid ( @pids ) { $totalDelta += $byPid{ $pid }{ delta } = sum( @{ $byPid{ $pid }{ current } }[ 2, 3 ] ) - sum( @{ $byPid{ $pid }{ last } }[ 2, 3 ] ); } system 'cls'; print "\n pid Name memory %cpu"; for my $pid ( @pids ) { printf "%5d %20s %10u %.1f%%\n", $pid, @{ $byPid{ $pid }{ last } }[ 0, 1 ], $byPid{ $pid }{ delta } * 100 / ($totalDelta||1); } }