Как передать «Прошедшее время» (или другой вывод) из 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

Примечание: «выбрать» на самом деле не работает таким образом.

Следующий фрагмент кода танцует вокруг желаемого вывода и может иметь ценность, хотя я не могу приспособить его к своим потребностям.

Я пытался найти исходный код 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