323 votes

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 ?
J'ai trouvé ça :

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

Mais j'aimerais quelque chose de plus simple comme

time .\do_something.ps1

1 votes

513voto

Keith Hill Points 73162

Yup.

Measure-Command { .\do_something.ps1 }

Notez qu'un inconvénient mineur de Measure-Command c'est que vous ne voyez pas stdout sortie.

[Mise à jour, merci à @JasonMArcher] Vous pouvez résoudre ce problème en envoyant la sortie de la commande à un commandlet qui écrit sur l'hôte, par ex. Out-Default alors ça devient :

Measure-Command { .\do_something.ps1 | Out-Default }

Une autre façon de voir la sortie serait d'utiliser le logiciel .NET Stopwatch comme ceci :

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

134 votes

Vous pouvez aussi voir une sortie comme celle-ci, Measure-Command {ps | Out-Default}. Ou toute autre chose qui écrit directement à l'hôte, ce qui peut être utile ou non.

24 votes

J'ai pris cette solution et écrit une fonction qui pourrait être utile à quelqu'un d'autre. gist.github.com/2206444 -- Exemple : time { ping -n 1 google.com } -Samples 10 exécutera la commande 10 et renvoie le temps moyen, minimum et maximum. Vous pouvez ajouter -Silent pour avaler STDOUT.

15 votes

Ma préférence serait d'assigner le résultat de Measure-Command à une variable, comme par exemple $t = Measure-Command {<<your command or code block>>} . Essayez-le et tapez ensuite $t à l'invite pour voir vos résultats et toutes les propriétés auxquelles vous avez accès, telles que $t.Milliseconds , $t.TotalSeconds etc. Ensuite, nous pouvons écrire sur la sortie que nous voulons, par exemple, Write-Host That command took $t.TotalSeconds to complete.

229voto

Shay Levy Points 41404

Vous pouvez également récupérer la dernière commande de l'historique et soustraire sa EndExecutionTime de son StartExecutionTime .

.\do_something.ps1  
$command = Get-History -Count 1  
$command.EndExecutionTime - $command.StartExecutionTime

27 votes

Essayez ça un jour : Get-History | Group {$_.StartExecutionTime.Hour} | sort Count -desc pour voir votre schéma d'utilisation de PowerShell par heure de la journée :-)

30 votes

+1 pour avoir pu l'utiliser afin de savoir combien de temps une action a pris, même si vous ne vous attendiez pas à ce qu'elle prenne beaucoup de temps au départ et que vous n'avez pas pensé à l'intégrer dans Measure-Command.

5 votes

powershell est génial parfois.

121voto

Droj Points 532

Utilisez Measure-Command

Exemple

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

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

0 votes

Je pense que vous voulez dire Measure-Command {<your command } | Out-Host - le Out-Host est en dehors du bloc script.

2 votes

@Peter - il doit être à l'intérieur du bloc, sinon Measure-Command consomme la sortie avant qu'elle n'aille dans la console.

0 votes

C'est ma faute - j'ai mal compris ce que vous vouliez faire : voir la sortie des commandes. Pour moi, je voulais voir le horaires Il fallait donc canaliser la sortie de Measure-Command pour les voir.

30voto

Mike West Points 29

Simples

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

on peut alors utiliser comme

time { .\some_command }

Vous pourriez vouloir modifier la sortie

2 votes

Measure-Command cache la sortie de la commande, donc cette solution est parfois meilleure.

1 votes

C'est une solution fantastique, qui respecte la sortie de la commande. Vous pouvez également l'invoquer sans accolades pour des commandes simples, par exemple : "time ls", exactement comme vous le feriez sous Unix.

0 votes

Je l'utilise pour mesurer les appels de fonction. Cependant, il est préférable d'ajouter les arguments à la convention d'appel, comme ceci : & $block @Args .

4voto

Kiquenet Points 2772

Utilisation du chronomètre et mise en forme 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"
}

Exemples 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 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X