Windows Command Line Equivalent to "time" in Linux? [duplicate] Windows Command Line Equivalent to "time" in Linux? [duplicate] powershell powershell

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.