Timing 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

 time .\do_something.ps1 

Ouaip.

 Measure-Command { .\do_something.ps1 } 

Notez que l’un des inconvénients mineurs de Measure-Command est que vous ne voyez aucune sortie stdout. Si vous voulez voir le résultat, vous pouvez utiliser l’object .NET Stopwatch, par exemple:

 $sw = [Diagnostics.Stopwatch]::StartNew() .\do_something.ps1 $sw.Stop() $sw.Elapsed 

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 

Utiliser la Measure-Command

Exemple

 Measure-Command {  | Out-Host } 

Le pipe to Out-Host vous permet de voir la sortie de la commande, qui est par ailleurs consommée par Measure-Command .

Simples

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

alors peut utiliser comme

 time { .\some_command } 

Vous voudrez peut-être modifier la sortie

En utilisant Chronomètre et formatage du temps écoulé:

 Function FormatElapsedTime($ts) { $elapsedTime = "" if ( $ts.Minutes -gt 0 ) { $elapsedTime = [ssortingng]::Format( "{0:00} min. {1:00}.{2:00} sec.", $ts.Minutes, $ts.Seconds, $ts.Milliseconds / 10 ); } else { $elapsedTime = [ssortingng]::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 = [ssortingng]::Format("{0:00} ms.", $ts.Milliseconds); } if ($ts.Milliseconds -eq 0) { $elapsedTime = [ssortingng]::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 } 

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

 function time { Param( [Parameter(Mandatory=$true)] [ssortingng]$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