如何从 PsList 通过管道传输 'Elapsed Time'(或其他输出)
How to pipe 'Elapsed Time' (or other output) from PsList
这个任务非常简单,但我似乎无法弄清楚(更令人沮丧的原因)- 我想查询 PsList 的特定进程和 return 它的特定部分常规输出。例如,我想 return 仅 下面 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
注意:'select'实际上并不是这样工作的。
以下 code snippet 围绕所需的输出跳动,可能很有价值,尽管我似乎无法满足我的需要。
我试图找到 pslist 的源代码(运气不好),看看逆向工程是否可以启发,并玩了 pslist rdcman | Get-Member
。 None 的成员信息很容易提供信息。
有什么建议吗?
Get-Process有一个startTime属性,所以当前时间减去这个就可以得到pslist提供的运行时间
(get-date) - (get-process rdcman).StartTime
这个 return 一个 powershell timespan 对象,所以你可以将它格式化为 d.hh:mm:ss with
"{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> $null
是从 pslist 生成的 suppress the error 输出。我们跳过输出中的前几行,因为每次都应该相同。
Process information for WYVERN:
Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
然后我们将每一行拆分为 space 组以获得一个数组。下一部分不应该那么复杂,但由于 EXE 名称可以包含 space,我们需要考虑到这一点。最后 7 列永远不应包含 space,因此这些列已在创建的 [pscustomobject]
中明确分配。在我们未分配的少数项目中,我们创建了一个 space 分隔字符串。 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"
这个任务非常简单,但我似乎无法弄清楚(更令人沮丧的原因)- 我想查询 PsList 的特定进程和 return 它的特定部分常规输出。例如,我想 return 仅 下面 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
注意:'select'实际上并不是这样工作的。
以下 code snippet 围绕所需的输出跳动,可能很有价值,尽管我似乎无法满足我的需要。
我试图找到 pslist 的源代码(运气不好),看看逆向工程是否可以启发,并玩了 pslist rdcman | Get-Member
。 None 的成员信息很容易提供信息。
有什么建议吗?
Get-Process有一个startTime属性,所以当前时间减去这个就可以得到pslist提供的运行时间
(get-date) - (get-process rdcman).StartTime
这个 return 一个 powershell timespan 对象,所以你可以将它格式化为 d.hh:mm:ss with
"{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> $null
是从 pslist 生成的 suppress the error 输出。我们跳过输出中的前几行,因为每次都应该相同。
Process information for WYVERN:
Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
然后我们将每一行拆分为 space 组以获得一个数组。下一部分不应该那么复杂,但由于 EXE 名称可以包含 space,我们需要考虑到这一点。最后 7 列永远不应包含 space,因此这些列已在创建的 [pscustomobject]
中明确分配。在我们未分配的少数项目中,我们创建了一个 space 分隔字符串。 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"