Deux choses sautent sur le fichier de commandes d'origine.
mais ni l'un ni l'autre ne va aider à long terme.
Quelle que soit votre méthode de référence, assurez-vous de saisir l'heure de début avant l'opération, et l'heure de fin après l'opération. Votre échantillon ne le fait pas.
%time%
évalue à quelque chose comme "12: 34: 56.78", et la commande SET /A
ne peut pas les soustraire. Vous avez besoin d'une commande qui produit un horodatage scalaire simple.
J'allais dire qu'il ne peut pas être fait, mais la langue de lot est beaucoup plus puissant que lui donne crédit, voici donc une implémentation simple de TIMER.BAT. Pour mémoire, Pax m'a battu à une réponse montrant la division de la chaîne alors que je bidouiller, et Johannes Rössel a suggéré de déplacer l'arithmétique en dehors de la région mesurée:
@echo off
setlocal
rem Remeber start time. Note that we don't look at the date, so this
rem calculation won't work right if the program run spans local midnight.
set t0=%time: =0%
rem do something here.... but probably with more care about quoting.
rem specifically, odd things will happen if any arguments contain
rem precent signs or carets and there may be no way to prevent it.
%*
rem Capture the end time before doing anything else
set t=%time: =0%
rem make t0 into a scaler in 100ths of a second, being careful not
rem to let SET/A misinterpret 08 and 09 as octal
set /a h=1%t0:~0,2%-100
set /a m=1%t0:~3,2%-100
set /a s=1%t0:~6,2%-100
set /a c=1%t0:~9,2%-100
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem make t into a scaler in 100ths of a second
set /a h=1%t:~0,2%-100
set /a m=1%t:~3,2%-100
set /a s=1%t:~6,2%-100
set /a c=1%t:~9,2%-100
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
rem runtime in 100ths is now just end - start
set /a runtime = %endtime% - %starttime%
set runtime = %s%.%c%
echo Started at %t0%
echo Ran for %runtime%0 ms
Vous pouvez simplifier l'arithmétique et être un peu plus honnête au sujet de la précision globale de ceci en ne dérangeant pas avec les centièmes d'une deuxième partie.Ici, il est en action, en supposant que vous avez une commande de sommeil ou d'une autre perte de temps:
C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>
Edit: Je révisé le code et sa description comme suggéré dans un commentaire.
Je pense que lorsque l'équipe NT a remplacé COMMAND.COM avec CMD.EXE, ils ont pensé qu'ils ne s'en tireraient pas en le rendant très différent. Mais en réalité, c'est presque une langue entièrement nouvelle. La plupart des anciennes commandes favorites ont de nouvelles fonctionnalités si les extensions sont activées.
L'un d'entre eux est SETLOCAL
qui empêche les variables de modifier l'environnement de l'appelant. Un autre est SET /A
qui vous donne une quantité remarquable d'arithmétique. L'astuce principale que j'ai utilisée ici est la nouvelle syntaxe d'extraction de sous-chaîne où %t:~3,2%
signifie les deux caractères commençant à l'offset 3 dans la valeur de la variable nommée t
. Pour un vrai shocker, jetez un oeil à la description complète de set (essayez SET /?
à une invite) et si cela ne vous effraie pas, regardez FOR /?
et notez qu'il peut analyser le texte à partir de fichiers ...
Edit 2: mauvaise manipulation de champs fixes de temps contenant 08
ou 09
rapporté par Frankie dans les commentaires. Tweaked quelques choses, et ajouté quelques commentaires.
Notez qu'il y a un oubli flagrant ici que je ne vais probablement pas résoudre. Cela ne fonctionnera pas si la commande commence un jour différent de la fin. C'est-à-dire, il va faire quelques calculs liés à l'heure de la journée et signaler une différence, mais la différence ne veut pas dire grand-chose. Il est facile de le fixer pour au moins prévenir de ce cas. La fixer pour faire la bonne chose est plus difficile.
Édition 3: Correction d'une erreur où% h% n'est pas défini correctement pour les heures à un chiffre. Cela est dû au% time% retournant "9: 01: 23.45". Remarquez l'espace. En utilisant% time: = 0% remplace l'espace par un zéro et% h% sera défini correctement. Cette erreur ne s'est produite que lorsqu'un script s'est déroulé d'une heure à l'autre.
shouldn » t vous définissez la fin après avoir fait quelques trucs? est-ce une faute de frappe? –
bien, vous pouvez simplement faire "time ./myscript" – mpen
@mark, dans une installation Windows stock, l'heure est une commande intégrée dans CMD.EXE qui définit ou affiche l'heure actuelle. – RBerteig