PS Aux 相当于 Windows 吗?

PS Aux 相当于 Windows 吗?

我有一个 PHP 面板,已从 Linux 机器移植到 Windows 机器。面板中显示特定进程的正常运行时间,以便用户了解系统上的程序已运行多长时间。在 Linux 中这很容易,因为我只需使用管道和正则表达式 PS Aux 和一些标志即可输出时间。但是,在 Windows 中我不知道该怎么做。我使用此命令输出有关程序的信息,认为 CPU 时间就是我想要的: tasklist /fi "imagename eq program.exe" /v

事实上,CPU 时间可以衡量进程在所有 CPU 上运行的时间,这当然可能与实际时间有很大不同,具体取决于进程在特定时间运行的线程数。

那么我如何使用 CMD 以现实世界的方式输出进程的运行时间?

答案1

从现实世界来看,我如何才能获得一个进程的运行时间?

假设:

  • 你说的“现实世界术语”实际上是指已用时间

有两种可能性:


pslist解决方案

使用列表Windows 系统内部

notepad++ 的输出示例:

F:\test>"c:\apps\WSCC\Sysinternals Suite"\pslist notepad++

pslist v1.3 - Sysinternals PsList
Copyright (C) 2000-2012 Mark Russinovich
Sysinternals - www.sysinternals.com

Process information for HAL:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
notepad++          8064   8   9  508  46828     0:02:05.003   148:52:29.866

使用以下批处理文件(example.cmd)清理输出:

@echo off
setlocal enabledelayedexpansion
for /f "usebackq skip=3 tokens=8" %%i in (`pslist notepad++ 2^> nul`) do (
  echo elapsed time: %%i
  )
endlocal

输出:

F:\test>example.cmd
elapsed time: 148:54:15.628

F:\test>

PowerShell 解决方案

使用以下 powershell 脚本 (GetProcessElapsedTime.ps1):

$ts=((get-date) - (get-process notepad++).StartTime)
$hours = ($ts.Days * 24 + $ts.Hours).ToString("00")
$minutes = $ts.Minutes.ToString("\:00")
$seconds = $ts.Seconds.ToString("\:00")
$milliseconds = $ts.Milliseconds.ToString("\.000")
Write-Output ($hours + $minutes + $seconds + $milliseconds)

notepad++ 的输出示例:

PS F:\test> .\GetProcessElapsedTime
148:54:46.667
PS F:\test>

免责声明

我不隶属于列表无论如何,我只是该软件的最终用户。

相关内容