Windows Command Line Equivalent to "time" in Linux? [duplicate]
The following is far from perfect. But it's the closest I could come up with to simulate UNIX time
behavior. I'm sure it can be improved a lot.
Basically I'm creating a cmdlet that receives a script block, generates a process and uses GetProcessTimes
to get Kernel, User and Elapsed times.
Once the cmdlet is loaded, just invoke it with
Measure-Time -Command {your-command} [-silent]
The -Silent
switch means no output generated from the command (I.e you are interested only in the time measures)
So for example:
Measure-Time -Command {Get-Process;sleep -Seconds 5} -Silent
The output generated:
Kernel time : 0.6084039User time : 0.6864044Elapsed : 00:00:06.6144000
Here is the cmdlet:
Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices;public class ProcessTime { [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool GetProcessTimes(IntPtr handle, out IntPtr creation, out IntPtr exit, out IntPtr kernel, out IntPtr user);}"@function Measure-Time{ [CmdletBinding()] param ([scriptblock] $Command, [switch] $Silent = $false ) begin { $creation = 0 $exit = 0 $kernel = 0 $user = 0 $psi = new-object diagnostics.ProcessStartInfo $psi.CreateNoWindow = $true $psi.RedirectStandardOutput = $true $psi.FileName = "powershell.exe" $psi.Arguments = "-command $Command" $psi.UseShellExecute = $false } process { $proc = [diagnostics.process]::start($psi) $buffer = $proc.StandardOutput.ReadToEnd() if (!$Silent) { Write-Output $buffer } $proc.WaitForExit() } end { $ret = [ProcessTime]::GetProcessTimes($proc.handle, [ref]$creation, [ref]$exit, [ref]$kernel, [ref]$user ) $kernelTime = [long]$kernel/10000000.0 $userTime = [long]$user/10000000.0 $elapsed = [datetime]::FromFileTime($exit) - [datetime]::FromFileTime($creation) Write-Output "Kernel time : $kernelTime" Write-Output "User time : $userTime" Write-Output "Elapsed : $elapsed" }}
I found a similar question on SuperUser which covers some alternatives. First and foremost being my suggestion to use Measure-Command
in PowerShell.
Measure-Command {ls}
Got the syntax wrong in my comment.