Powershell 如何从PsList中导入“已用时间”(或其他输出)

Powershell 如何从PsList中导入“已用时间”(或其他输出),powershell,admin,pipeline,sysinternals,Powershell,Admin,Pipeline,Sysinternals,这项任务非常简单,但我似乎无法找出它更令人沮丧的原因——我想查询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以获取特定进程并返回其常规输出的特定部分。在这个示例中,我只想从下面的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
这样,psuedocode和行为将如下所示:

pslist rdcman | select Elapsed Time
 > 5:02:31.886
注意:“选择”实际上不是这样工作的

以下内容围绕着所需的输出进行,可能很有价值,尽管我似乎无法根据自己的需要进行按摩

我试图找到pslist的源代码,看看逆向工程是否能有所启发,并与pslist rdcman | Get Member一起玩。没有一个成员的信息是现成的信息


有什么建议吗?

Get进程有一个startTime属性,因此当前时间减去它可以得到pslist提供的运行时间

(get-date) - (get-process rdcman).StartTime
这将返回powershell timespan对象,因此您可以使用将其格式化为d.hh:mm:ss

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

无论出于何种原因,如果您对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>将从pslist生成$null输出。我们跳过输出中的前几行,因为每次输出都应该是相同的

Process information for WYVERN:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time 
然后我们将每一行分割成一组空间,得到一个数组。下一部分不应该那么复杂,但因为EXE名称可以包含空格,所以我们需要说明这一点。最后7列不应包含空格,因此这些列在创建的[pscustomobject]中显式分配。在我们没有分配的少数项目中,我们创建了一个以空格分隔的字符串。格式表只是为了让它在屏幕上看起来更漂亮。如果需要操作输出,请在| Format表前面操作

样本输出

在获取rdcman信息的情况下,您可以尝试以下方法。此代码取代了上面代码的最后一行

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


PsList似乎只是返回原始字符串输出,这意味着您需要像链接的代码段那样对其进行分析。在更改$output=。\PsList.exe 2>$null到$output=PsList.exe 2>$null后,我能够运行此代码。通过复制输出来实现“生成您自己的对象”的路线似乎比直接过滤pslist的结果更为迂回,但仍然很有用。谢谢@Matt!
} | Where-Object{$_.Name -eq "rdcman"} | Select -ExpandProperty "Elapsed Time"
} ?{$_.Name -eq "rdcman"} | Select -Expand "Elapsed Time"