Function 在powershell中创建别名以测量函数的时间

Function 在powershell中创建别名以测量函数的时间,function,powershell,function-pointers,alias,stopwatch,Function,Powershell,Function Pointers,Alias,Stopwatch,我在绑定到别名的PowerShell脚本中有一组操作系统函数,如下所示: function Run { # somethin that takes a while } set-alias r Run 我想测量每次通话的时间。为此,我想使用另一个函数来创建.NET秒表,启动它,运行指定的操作,停止秒表,并打印出时间,如下所示: function Crono($action) { $sw = [Diagnostics.Stopwatch]::StartNew() & $

我在绑定到别名的PowerShell脚本中有一组操作系统函数,如下所示:

function Run
{
    # somethin that takes a while
}

set-alias r Run
我想测量每次通话的时间。为此,我想使用另一个函数来创建.NET
秒表
,启动它,运行指定的操作,停止
秒表
,并打印出时间,如下所示:

function Crono($action)
{
$sw = [Diagnostics.Stopwatch]::StartNew()

    & $action

$sw.Stop()
Write-Host "> Operation done in: " + $sw.Elapsed;
}

set-alias r Crono(Run)
但此别名会引发以下错误:

集合别名:找不到接受的位置参数 参数“System.Object[]”。在…\script.ps1:85字符:10
+设置别名从
获取帮助设置别名

*这些命令显示了如何将别名指定给带有参数的命令,甚至是许多命令的管道。 可以为cmdlet创建别名,但不能为包含cmdlet及其参数的命令创建别名。但是,如果将命令放置在函数或脚本中,则可以创建有用的函数或脚本名称,并且可以为函数或脚本创建一个或多个别名。 在本例中,用户希望为命令“set location c:\windows\system32”创建别名,其中“set location”是cmdlet,“c:\windows\system32”是Path参数的值。 为此,第一个命令创建一个名为“CD32”的函数,其中包含Set Location命令。 第二个命令为CD32函数创建别名“go”。然后,要运行Set Location命令,用户可以键入“CD32”或“go”


只能使用不带参数的别名命令。因此,您必须创建一个伪函数来调用
Chrono(Run)
并将其别名。

您可以使用“measure Command”cmdlet来测量表达式、脚本块和cmdlet所用的时间

您还可以检查历史记录项的*ExecutionTime属性:

PS> Get-History -Count 1 | fl *

Id                 : 31
CommandLine        : Get-History -Count 1
ExecutionStatus    : Completed
StartExecutionTime : 3/13/2013 2:50:11 PM
EndExecutionTime   : 3/13/2013 2:50:11 PM

为什么不直接使用
Measure命令
?因为我不知道,正如其他答案所指出的那样,您不能为它创建别名。是的,但是如何创建自动执行的别名?您只能为不包含参数的另一个命令创建别名。要包含参数,请创建一个调用目标的函数。
 PS C:\> function CD32 {set-location c:\windows\system32}
 PS C:\>set-alias go cd32*
PS> Get-History -Count 1 | fl *

Id                 : 31
CommandLine        : Get-History -Count 1
ExecutionStatus    : Completed
StartExecutionTime : 3/13/2013 2:50:11 PM
EndExecutionTime   : 3/13/2013 2:50:11 PM