Le moyen le plus simple de chronométrer un outil de ligne de commande


9

Quelle est la manière la plus simple / la plus rapide de chronométrer un outil en ligne de commande?

Cela n'a pas besoin d'être super précis (+/- secondes c'est bien) car je m'attends à ce que cela prenne des minutes ou même 1 heure +. Et l'écriture d'un fichier batch est très bien aussi. De plus, il n'a pas besoin de faire des calculs à temps, il suffit d'afficher l'heure de début et l'heure de fin.


Pourrait appartenir à Stackoverflow.
Joey

2
Si je dois "programmer" quelque chose pour que cela fonctionne ... la solution est trop compliquée. Il doit y avoir un outil en ligne de commande ou une solution batch simple pour cela, non?
slolife

Plus probablement sur Serverfault.
Kirill V. Lyadvinsky

Généralement, le système d'exploitation ne se soucie que du temps processeur qu'il a utilisé. Ma réponse ci-dessous fera ce que vous voulez. J'utilise simplement un fichier journal pour stocker les informations.
Axxmasterr

Réponses:


19

J'utilise habituellement

echo.|time & my_command & echo.|time

quand je n'ai rien d'autre à portée de main. Cela provoque une sortie comme celle-ci:

> echo. | time & ping -n 4 localhost> nul & echo. | time
L'heure actuelle est: 18: 42: 34,63
Entrez la nouvelle heure:
L'heure actuelle est: 18: 42: 37,68
Entrez la nouvelle heure:

Pas joli et peut être rendu plus joli en passant par findstr:

echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current

Si vous avez retardé l'expansion activée par défaut (ou démarré cmd avec /v:oncomme argument), vous pouvez également l'utiliser echo !time!sans avoir à recourir à des hacks laids avec redirection d'entrée.

Si vous souhaitez utiliser un fichier batch, vous pouvez le faire comme ceci:

@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%

J'ai ajouté une redirection vers nul pour stdout et stderr ici, car sinon il pourrait être difficile de trouver les lignes de début et de fin. Vous pouvez supprimer cela si cela ne vous concerne pas.

Mais de nos jours, j'utilise principalement TimeThis - qui a malheureusement été supprimé.

PowerShell propose également un moyen:

Measure-Command { my_command }

mais vous devez faire attention aux choses qui dépendent du répertoire de travail ou de la redirection. Pour que ceux-ci fonctionnent correctement, vous pourriez avoir besoin d'une petite ruse:

@echo off
setlocal enableextensions

rem Prepare current directory and command line so they
rem can be stuck into a single-quoted PowerShell string.
set "Dir=%CD:'=''%"
set "Cmd=%*"
set "Cmd=%Cmd:'=''%"

rem Prepare command to pass to PowerShell
set Command=
set "Command=&{"
set "Command=%Command%  Set-Location '%Dir%'"
set "Command=%Command%; [Environment]::CurrentDirectory = '%Dir%'"
set "Command=%Command%; $start = Get-Date"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host"
set "Command=%Command%; iex 'cmd /c %Cmd%'"
set "Command=%Command%; $end = Get-Date"
set "Command=%Command%; Write-Host"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host ('    End time     : ' + $end.ToString())"
set "Command=%Command%; Write-Host ('    Elapsed time : ' + ($end - $start).ToString())"
set "Command=%Command%; }"

powershell -noprofile -command "%Command%"

endlocal

Cela peut être exécuté de la même manière que timethis, assurez-vous d'échapper les guillemets doubles avec \"s'ils sont nécessaires dans la ligne de commande (de même timethisque également). La sortie produite est similaire. Les redirections ne fonctionneront pas, cependant.


TimeThis provient du kit de ressources Windows 2000 et n'est plus disponible; en 2003 Resource Kit est TimeIt, qui ne fonctionnait pas sur mon 64 bits Win7. Pour une solution PowerShell, voir superuser.com/questions/228056/…
pesche

Ça craint. Cependant, j'ai toujours l'exécutable qui traîne ici depuis les temps anciens.
Joey

@pesche: J'ai ajouté un fichier batch qui peut servir de remplacement pour timethis.
Joey

4

Vous pouvez utiliser le planificateur système pour exécuter la commande à votre place.

Panneau de configuration -> Tâches planifiées -> créer un nouveau ....

Pointez simplement la tâche planifiée sur la commande que vous souhaitez exécuter et elle devrait faire ce que vous voulez.

Si vous souhaitez créer un fichier journal qui stocke les informations d'état temporel, vous pouvez envisager de faire quelque chose de similaire au script ci-dessus.

J'utilise un utilitaire appelé "maintenant" pour ce faire car il fera écho à la date et à l'heure. C'est très pratique pour les scripts de ligne de commande dont vous souhaitez garder la trace dans les fichiers journaux, mais qui n'ont pas l'intelligence d'inclure une date / heure en mode natif. Très pratique car il ne se soucie pas d'une réponse et disparaît lorsque vous en avez terminé.

Maintenant Utlity peut être trouvé ici

Un exemple de script serait ...

echo -------------- >>logfile.txt
now Process Starting>> logfile.txt
<commandhere> <target> >> logfile.txt
now process Ending >> logfile.txt
echo -------------- >> logfile.txt

La sortie d'échantillon ressemblerait à

--------------
Mon Mar 06 14:58:48 2009 Process Starting
GNU Super Duper Process PID 12345! Success
Mon Mar 06 21:47:01 2009 Process Ending
--------------

4

une autre option consiste à utiliser la timecommande /tqui mettra l'heure actuelle à la console (ou la redirigera vers un journal) sans demander l'heure à définir. il y a une limitation en ce qu'il vous donnera les heures, les minutes, mais pas les secondes et les millisecondes.

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log

Malheureusement, "time / t" ne produit pas les secondes, juste "hour: minute am / pm".
slolife

vous avez raison, j'ai mis à jour la réponse.
akf

1

Si vous avez PowerShell, vous pouvez le faire (une seule ligne, divisée pour plus de lisibilité):

PS C:\> $startTime=Get-Date;ping /n 4 localhost;$endTime=Get-Date;
        echo "Finished in $(($endTime-$startTime).ToString())"

Ou enregistrez-le dans un fichier pour une réutilisation plus facile.

# usage: .\timer.ps1 program [arguments]

$startTime = Get-Date;
$prog = $args[0];
$progargs = $args[1..($args.length-1)];

&$prog $progargs

$endTime = Get-Date;

echo "Finished in $(($endTime - $startTime).ToString())";

1
In command prompt:
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime

Output:
C:\Users\Steini> wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.370000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.525000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.627000+000

15,5 ms et 10,2 ms en utilisant Ctrl + v à partir du presse-papiers


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.