Как да подадете „Изминало време“ (или друг изход) от PsList

Тази задача е невероятно проста, но изглежда не мога да я разбера (още повече причината е разочароваща) - бих искал да направя запитване към PsList за конкретен процес и да върна конкретна част от неговия редовен изход. Например, бих искал да върна само полето „Изминало време“ от изхода на PsList по-долу

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time 
RDCMan             7384   8  22 1316  60432     0:00:54.101     5:02:31.886

така че псевдокодът и поведението биха били както следва:

pslist rdcman | select Elapsed Time
 > 5:02:31.886

Забележка: 'select' всъщност не работи по този начин.

Следното кодов фрагмент танцува около желания изход и може да е от полза, въпреки че изглежда не мога да го масажирам според нуждите си.

Опитах се да намеря изходния код на pslist (без късмет), за да видя дали обратното инженерство може да просвети и си поиграх с pslist rdcman | Get-Member. Нито една информация за членовете не беше лесно информативна.

Някакъв съвет?


person zelusp    schedule 02.02.2015    source източник
comment
Изглежда, че PsList просто връща необработен низ, което означава, че ще трябва да го анализирате, както е направил свързаният кодов фрагмент.   -  person Guvante    schedule 03.02.2015


Отговори (2)


Ако по някаква причина сте настроени към изхода от pslist, можете също да направите това, за да го превърнете в обект на PowerShell

$output = .\pslist.exe 2> $null 
$output | Select -Skip 3 | ForEach-Object{
    $procInfo = $_ -split "\s+"
    [pscustomobject][ordered]@{
        Name = $procInfo[0..($procInfo.Count -8)] -Join " "                
        Pid = $procInfo[-7] 
        Pri = $procInfo[-6] 
        Thd = $procInfo[-5] 
        Hnd = $procInfo[-4] 
        Priv = $procInfo[-3]     
        "CPU Time" = $procInfo[-2]  
        "Elapsed Time" = $procInfo[-1] 
    }
} | Format-Table

.\pslist.exe 2> $null беше да потиска изхода за грешка, генериран от pslist . Пропускаме първите няколко реда в изхода, тъй като трябва да е един и същ всеки път.

Process information for WYVERN:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time 

След това разделяме всеки ред на групи от пространство, за да получим масив. Следващата част не трябваше да е толкова сложна, но тъй като EXE имената могат да съдържат интервали, трябваше да отчетем това. Последните 7 колони никога не трябва да съдържат интервал, така че те са изрично зададени в [pscustomobject], който е създаден. От малкото елементи от това, които не сме присвоили, създадохме низ, разделен с интервал. Format-Table е там само за да го направи красив на екрана. Ако трябва да манипулирате изхода, направете го пред | Format-Table.

Примерен резултат

Name                      Pid   Pri Thd Hnd  Priv    CPU Time       Elapsed Time 
----                      ---   --- --- ---  ----    --------       ------------ 
Idle                      0     0   4   0    0       1059:54:59.735 0:00:00.000  
System                    4     8   146 952  220     2:13:41.415    300:01:13.336
smss                      312   11  3   32   580     0:00:00.062    300:01:13.320
csrss                     512   13  10  858  3076    0:00:20.139    300:01:09.763
wininit                   628   13  3   82   1688    0:00:00.062    300:01:07.985
csrss                     644   13  12  1514 5540    0:19:56.168    300:01:07.969
services                  696   9   7   274  7056    0:00:39.296    300:01:07.798

В случай на получаване на информация за rdcman можете просто да опитате следното. Този код е на мястото на последния ред от горния код

} | Where-Object{$_.Name -eq "rdcman"} | Select -ExpandProperty "Elapsed Time"

or

} ?{$_.Name -eq "rdcman"} | Select -Expand "Elapsed Time"
person Matt    schedule 03.02.2015
comment
След като промених $output = .\pslist.exe 2> $null на $output = pslist.exe 2> $null успях да стартирам този код. Поемането на маршрута „направете свой собствен обект“ чрез копиране на изхода изглежда по-заобиколен от директното филтриране на резултата от pslist, но остава полезно. Благодаря @Matt! - person zelusp; 03.02.2015

Get-Process има свойство startTime, така че текущото време минус това може да даде изминалото време, което pslist предоставя.

(get-date) - (get-process rdcman).StartTime

Това връща обект от времеви диапазон на powershell, така че можете да го форматирате в d.hh:mm:ss с

"{0:c}" -f  ((get-date) - (get-process rdcman).StartTime) 
person RM1358    schedule 02.02.2015