我有一个 PHP 面板,已从 Linux 机器移植到 Windows 机器。面板中显示特定进程的正常运行时间,以便用户了解系统上的程序已运行多长时间。在 Linux 中这很容易,因为我只需使用管道和正则表达式 PS Aux 和一些标志即可输出时间。但是,在 Windows 中我不知道该怎么做。我使用此命令输出有关程序的信息,认为 CPU 时间就是我想要的: tasklist /fi "imagename eq program.exe" /v
事实上,CPU 时间可以衡量进程在所有 CPU 上运行的时间,这当然可能与实际时间有很大不同,具体取决于进程在特定时间运行的线程数。
那么我如何使用 CMD 以现实世界的方式输出进程的运行时间?
答案1
从现实世界来看,我如何才能获得一个进程的运行时间?
假设:
- 你说的“现实世界术语”实际上是指已用时间
有两种可能性:
pslist
(从Windows 系统内部)- 电源外壳
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>
免责声明
我不隶属于列表无论如何,我只是该软件的最终用户。