2

这个任务非常简单,但我似乎无法弄清楚(更令人沮丧的原因) - 我想查询 PsList 以获取特定进程并返回其常规输出的特定部分。例如,我只想从下面的 PsList 输出中返回“Elapsed Time”字段

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. 没有一个成员信息是容易提供信息的。

有什么建议吗?

4

2 回答 2

3

如果出于某种原因,您对 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"

或者

} ?{$_.Name -eq "rdcman"} | Select -Expand "Elapsed Time"
于 2015-02-03T01:07:24.817 回答
2

Get-Process 有一个 startTime 属性,因此当前时间减去它可以得到 pslist 提供的经过时间。

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

这将返回一个 powershell 时间跨度对象,因此您可以将其格式化为 d.hh:mm:ss

"{0:c}" -f  ((get-date) - (get-process rdcman).StartTime) 
于 2015-02-02T22:56:20.430 回答