2009-03-16 6 views
1

Comment puis-je compter le nombre d'appels d'un fichier cmd?Comment puis-je compter le nombre d'appels d'un fichier cmd?

Je suis aux prises avec quelque chose comme ça, mais cela n'a pas fonctionné:

@IF NOT EXIST Calls.log echo. > Calls.log 
@for %%i in (Calls.log) do set size=%%~zi 
@IF %size% EQU 0 (
@ECHO 1 > Calls.log 
) ELSE (
@set /p v=<Calls.log 
@set /A v+=1 
@echo %v% > Calls.log 
) 

Répondre

2

Si tout ce que vous essayez de faire est de compter combien de fois un script cmd est appelé, vous pouvez simplement ajouter un caractère dans un fichier à chaque fois qu'il fonctionne plutôt que de jouer avec l'évaluation de l'expression à chaque fois que le script est exécuté. Cela a aussi l'avantage de rendre le script plus rapide puisque l'analyse du compte est déplacée ailleurs. Le fichier compteur se développe d'un octet à chaque fois, alors faites attention si vous l'appelez vraiment un grand nombre de fois depuis que le fichier va se développer. Mais même, en l'appelant une fois par seconde, un fichier 1G s'accumulera seulement après 30 ans.

En haut de votre script, vient de mettre:

set >>countfile.txt <nul: /p x=X 

Cela ajoute simplement le caractère X à la fin du fichier countfile.txt chaque fois que le script est appelé. Il utilise la commande "set/p" avec une redirection d'entrée/sortie, ce qui est le seul moyen dont je dispose pour sortir un caractère sans CR/LF (comme le "echo -n" UNIX). Pour obtenir le nombre d'appels à ce jour, vous pouvez utiliser le modificateur de variable d'environnement de taille de fichier, comme dans le script suivant (je pense que cela sera fait moins souvent que d'exécuter le script, donc il vaut mieux mettre le travail grunt ici [en fait, il n'y a pas beaucoup de travail fastidieux car il est sans compter les personnages, plutôt obtient les informations directement à partir de l'entrée du répertoire]):

@echo off 
    goto :main 
:getsize 
    echo %~z1 
    goto :eof 
:main 
    setlocal enableextensions enabledelayedexpansion 
    call :getsize countfile.txt 
    endlocal 

Pour réinitialiser le compteur, utilisez les touches suivantes extrêmement commande compliquée (je pense breveter ceci):

del countfile.txt 

Une autre chose que je suggère - vous n'avez pas besoin de préfixer chaque commande avec "@" pour éviter l'écho, vous pouvez simplement mettre "@echo off" en haut de votre script pour le no-echo global. Si vous voulez faire écho sélectivement à certaines commandes, ignorez simplement ce paragraphe.

1

Le bloc if complet est analysé à la fois et donc toutes les variables d'environnement dans ce OBTIENNENT remplacés par leurs valeurs au moment avant le bloc if est exécuté. Vous devez activer l'extension de variable retardée et utiliser !v!:

@setlocal enabledelayedexpansion 
@IF NOT EXIST Calls.log echo. > Calls.log 
@for %%i in (Calls.log) do set size=%%~zi 
@IF %size% EQU 0 (
    @ECHO 1 > Calls.log 
) ELSE (
    @set /p v=<Calls.log 
    @set /A v+=1 
    @echo !v! > Calls.log 
) 

Et vous pouvez simplifier le code comme suit:

@echo off 
setlocal enabledelayedexpansion 
IF NOT EXIST Calls.log (
    ECHO 1 > Calls.log 
) ELSE (
    set /p v=<Calls.log 
    set /A v+=1 
    echo !v! > Calls.log 
) 

Il n'y a pas besoin de créer le fichier au préalable (et même que je serais résoudre avec copy nul Calls.log, puisque cela assure une taille de fichier de 0).

+0

De rien. Pour ce cas, il y a la possibilité d'accepter une réponse :) – Joey

0

Le code suivant fonctionne sur mon ordinateur:

@if not exist Calls.log (
echo 0 > Calls.log 
) 
@set /p v=< Calls.log 
@set /a v=v+1 
echo %v% > Calls.log 
Questions connexes