Windows命令行相当于Linux中的“时间”?

Windows Command Line Equivalent to “time” in Linux?

本问题已经有最佳答案,请猛点这里访问。

我有一个可能是一个愚蠢的问题,但我似乎无法在网上找到答案。 在基于linux的系统中,在终端中输入"time"之前,任何命令都会根据实际,用户和系统时间给出命令所需的时间。 例如,输入

1
time ls

列出当前目录中的文件和文件夹,然后列出列出文件和文件夹所花费的实际,用户和系统时间。 有窗户相当吗? 我试图比较不同算法的性能,但没有Linux机器工作,所以我希望在Windows中有类似的命令。


以下内容远非完美。 但它是我能够最接近模拟UNIX time行为的。 我相信它可以改进很多。

基本上我正在创建一个接收脚本块的cmdlet,生成一个进程并使用GetProcessTimes来获取内核,用户和经过的时间。

加载cmdlet后,只需调用它即可

Measure-Time -Command {your-command} [-silent]

-Silent开关表示没有从命令生成的输出(即,您只对时间测量感兴趣)

例如:

1
Measure-Time -Command {Get-Process;sleep -Seconds 5} -Silent

生成的输出:

1
2
3
Kernel time : 0.6084039
User time   : 0.6864044
Elapsed     : 00:00:06.6144000

这是cmdlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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"
    }
}

我在SuperUser上发现了一个类似的问题,它涵盖了一些替代方案。 首先是我建议在PowerShell中使用Measure-Command

1
Measure-Command {ls}

我的评论中的语法错误。