如何计算cmd文件的调用次数?

时间:2009-03-16 23:32:53

标签: scripting batch-file 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
)

3 个答案:

答案 0 :(得分:2)

如果您要做的只是计算cmd脚本被调用的次数,您可以在每次运行时将一个字符附加到文件,而不是每次运行脚本时都要进行表达式评估。这也有利于使脚本更快,因为计数的分析被移动到其他地方。

计数器文件每次都会扩展一个字节,因此请注意,如果您正在调用它,因为文件将会扩展。但即使是每秒调用一次,1G文件也只会在30年后产生。

在脚本的顶部,只需输入:

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

每次调用脚本时,这只会将X字符添加到countfile.txt文件的末尾。它使用带有输入/输出重定向的“set/p”命令,这是我知道在没有CR / LF的情况下获取字符的唯一方法(如UNIX“echo -n” )。

要计算到目前为止的调用次数,您可以使用文件大小环境变量修饰符,如下面的脚本(我希望这样做比运行脚本更少,所以最好放置grunt在这里工作[事实上,它不是很多繁琐的工作,因为它不计算字符,而是直接从目录条目中获取信息]):

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

要重置计数,请使用以下非常复杂的命令(我正在考虑申请专利):

del countfile.txt

我建议的另一件事 - 您不需要为每个命令添加“@”前缀以防止回声,您只需将“@echo off”放在脚本的顶部即可全球无回声。如果您想有选择地回显某些命令,请忽略此段落。

答案 1 :(得分:1)

立即解析完整的if块,因此其中的所有环境变量将在 {/ 1}}块执行之前的时被其值替换。您需要启用延迟变量扩展并使用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 ) 解决,因为这样可以确保文件大小为0)。

答案 2 :(得分:0)

以下代码适用于我的计算机:

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