Как подсчитать, сколько вызовов из cmd-файла? - PullRequest
1 голос
/ 17 марта 2009

Как подсчитать, сколько вызовов в cmd-файле?

Я борюсь с чем-то вроде этого, но это не сработало:

@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
)

Ответы [ 3 ]

2 голосов
/ 17 марта 2009

Если все, что вы пытаетесь сделать, это подсчитать, сколько раз вызывается сценарий cmd, вы можете просто добавлять один символ в файл каждый раз, когда он выполняется, вместо того, чтобы возиться с оценкой выражения при каждом запуске сценария. Это также имеет преимущество, заключающееся в том, что скрипт становится быстрее, так как анализ счетчика перемещен в другое место.

Файл счетчика расширяется на один байт каждый раз, так что будьте осторожны, если вы вызываете его действительно большое количество раз, так как файл будет расширяться. Но даже, вызывая его один раз в секунду, файл 1G будет накапливаться только через 30 лет.

В верхней части вашего сценария просто поставьте:

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

Это просто добавляет символ X в конец файла countfile.txt каждый раз, когда вызывается скрипт. Он использует команду "set/p" с перенаправлением ввода / вывода, что является единственным способом, которым я знаю, чтобы вывести символ без CR / LF после него (как UNIX "echo -n").

Чтобы подсчитать количество вызовов на сегодняшний день, вы можете использовать модификатор переменной окружения размера файла, как в следующем скрипте (я ожидаю, что это будет происходить реже, чем запуск скрипта, поэтому лучше поставить хрюк работать здесь [на самом деле, это не много тяжелой работы, поскольку она не считает символы, скорее она получает информацию непосредственно из записи каталога]):

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

Чтобы сбросить счетчик, используйте следующую чрезвычайно сложную команду (я думаю запатентовать это):

del countfile.txt

Еще одна вещь, которую я бы предложил - вам не нужно ставить перед каждой командой префикс "@" для предотвращения эха, вы можете просто поставить "@echo off" в верхней части вашего скрипта для глобального no-echo , Если вы хотите выборочно отображать некоторые команды, просто игнорируйте этот параграф.

1 голос
/ 17 марта 2009

Полный блок if анализируется сразу, и, следовательно, все переменные окружения в нем заменяются своими значениями за время до того, как блок if будет выполнен. Вам нужно включить отложенное расширение переменной и использовать !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
)

И вы можете упростить код следующим образом:

@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
)

Нет необходимости создавать файл заранее (и даже это я решу с помощью copy nul Calls.log, поскольку это обеспечивает размер файла 0).

0 голосов
/ 17 марта 2009

На моем компьютере работает следующий код:

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