2009-03-16 3 views
1

Как я могу подсчитать, сколько вызовов cmd-файла?Как я могу подсчитать, сколько вызовов 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 
) 

ответ

2

Если все, что вы пытаетесь сделать, это подсчитать, сколько раз называется 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» в верхней части вашего скрипта для глобального не-эха. Если вы хотите выборочно повторять некоторые команды, просто игнорируйте этот абзац.

1

Полный 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

Добро пожаловать. Для этого случая есть возможность принять ответ :) – Joey

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^