Chronométrer l'exécution d'une commande dans PowerShell

Existe-t-il un moyen simple de chronométrer L'exécution d'une commande dans PowerShell, comme la commande 'time' sous Linux?
Je suis venu avec ceci:

$s=Get-Date; .do_something.ps1 ; $e=Get-Date; ($e - $s).TotalSeconds

Mais je voudrais quelque chose de plus simple comme

time .do_something.ps1
158
demandé sur Paolo Tedesco 2010-08-18 19:17:11

6 réponses

Oui.

Measure-Command { .\do_something.ps1 }

Notez qu'un inconvénient mineur de Measure-Command est que vous ne voyez aucune sortie stdout. Si vous voulez voir la sortie, vous pouvez utiliser L'objet. net Stopwatch, par exemple:

$sw = [Diagnostics.Stopwatch]::StartNew()
.\do_something.ps1
$sw.Stop()
$sw.Elapsed
257
répondu Keith Hill 2010-08-22 21:55:29

Vous pouvez également obtenir la dernière commande de l'historique et soustraire son EndExecutionTime de son StartExecutionTime.

.\do_something.ps1  
$command = Get-History -Count 1  
$command.EndExecutionTime - $command.StartExecutionTime
135
répondu Shay Levy 2014-12-08 23:18:05

Utiliser Measure-Command

Exemple

Measure-Command { <your command here> | Out-Host }

Le tuyau de Out-Host permet de voir la sortie de la commande, qui est sinon consommé par Measure-Command.

72
répondu Droj 2017-06-29 09:31:26

Simples

function time($block) {
    $sw = [Diagnostics.Stopwatch]::StartNew()
    &$block
    $sw.Stop()
    $sw.Elapsed
}

Peut alors utiliser comme

time { .\some_command }

Vous pouvez modifier la sortie

12
répondu Mike West 2013-04-08 17:43:18

Utilisation du chronomètre et formatage du temps écoulé:

Function FormatElapsedTime($ts) 
{
    $elapsedTime = ""

    if ( $ts.Minutes -gt 0 )
    {
        $elapsedTime = [string]::Format( "{0:00} min. {1:00}.{2:00} sec.", $ts.Minutes, $ts.Seconds, $ts.Milliseconds / 10 );
    }
    else
    {
        $elapsedTime = [string]::Format( "{0:00}.{1:00} sec.", $ts.Seconds, $ts.Milliseconds / 10 );
    }

    if ($ts.Hours -eq 0 -and $ts.Minutes -eq 0 -and $ts.Seconds -eq 0)
    {
        $elapsedTime = [string]::Format("{0:00} ms.", $ts.Milliseconds);
    }

    if ($ts.Milliseconds -eq 0)
    {
        $elapsedTime = [string]::Format("{0} ms", $ts.TotalMilliseconds);
    }

    return $elapsedTime
}

Function StepTimeBlock($step, $block) 
{
    Write-Host "`r`n*****"
    Write-Host $step
    Write-Host "`r`n*****"

    $sw = [Diagnostics.Stopwatch]::StartNew()
    &$block
    $sw.Stop()
    $time = $sw.Elapsed

    $formatTime = FormatElapsedTime $time
    Write-Host "`r`n`t=====> $step took $formatTime"
}

Échantillons D'Utilisation

StepTimeBlock ("Publish {0} Reports" -f $Script:ArrayReportsList.Count)  { 
    $Script:ArrayReportsList | % { Publish-Report $WebServiceSSRSRDL $_ $CarpetaReports $CarpetaDataSources $Script:datasourceReport };
}

StepTimeBlock ("My Process")  {  .\do_something.ps1 }
3
répondu Kiquenet 2013-10-11 10:42:54

Voici une fonction que j'ai écrite qui fonctionne de manière similaire à la commande Unix time:

function time {
    Param(
        [Parameter(Mandatory=$true)]
        [string]$command,
        [switch]$quiet = $false
    )
    $start = Get-Date
    try {
        if ( -not $quiet ) {
            iex $command | Write-Host
        } else {
            iex $command > $null
        }
    } finally {
        $(Get-Date) - $start
    }
}

Source: https://gist.github.com/bender-the-greatest/741f696d965ed9728dc6287bdd336874

3
répondu Bender the Greatest 2017-11-17 17:38:18