【问题标题】:Create a counter that persists between runs of a windows CMD file?创建一个在 Windows CMD 文件运行之间持续存在的计数器?
【发布时间】:2020-10-26 18:38:16
【问题描述】:

在 Windows Server 2008r2 环境中,我有作为计划任务运行的 CMD 文件(不是 Powershell)。我正在寻找一种实现逻辑的方法: "如果此命令在过去十次运行中都出现此错误情况,请执行一些操作(如发送短信)"

所以我想实现一个持久计数器来存储 CMD 之前运行的错误计数。

我在系统环境中搜索了设置值,(SETX)但它似乎稍后生效并且还有其他缺点。 或者,可以通过编写文件 1.txt、2.txt 等来实现持久计数器,但这看起来既复杂又难看。

这两种方法中的任何一种都可能需要足够的时间和精力,但我想我会在这里检查一下,以防有人以前做过类似的事情。有没有人有一种更优雅的方式来实现一个计数器,该计数器的状态在 Windows CMD 文件的单独运行之间持续存在?

通常当我写完一个问题时,我会看到类似问题中已经显示了答案,但在这种情况下我没有,所以我会继续发布。

【问题讨论】:

  • 让我们假设用作计数器的环境变量的名称为Counter。然后您可以在批处理文件中使用>"%APPDATA%\%~n0.ini" echo Counter=%Counter%将环境变量的当前值保存到一个文本文件中,该文件名为批处理文件,文件扩展名为.ini在应用程序数据目录中,然后退出批处理文件并使用if exist "%APPDATA%\%~n0.ini" (for /F "usebackq delims=" %%I in ("%APPDATA%\%~n0.ini") do set "%%I") else set "Counter=0"重新加载具有 INI 文件中最后一个值的变量,并在 bat 文件顶部定义具有加载值的变量 Counter
  • 设置 %_counter% 然后尝试使用 %counter% 不是很有帮助。
  • @Stephan,你是对的 - 我误读了 SET /A 上的 ss64 文本,上面写着“SET /A 允许您省略 % 的所以 _myvar 而不是 %_myvar%”作为“SET /A 允许您省略 %,所以 _myvar 而不是 %myvar%" IE 我认为 _ 是而不是 %。

标签: batch-file environment-variables windows-server-2008-r2


【解决方案1】:

@Mofi 在他的评论中提供了一些先进技术的解决方案。由于评论格式限制,我不清楚,所以我创建了一个测试脚本。 @Stephan 注意到我误读了 _ 替换为 %%。 进一步调试发现 IF 的算术比较形式不能与 ( ) 一起使用,因此重新构造为使用 goto。这是一个工作脚本:

rem read in existing cntr
if exist "%APPDATA%\%~n0.ini"    (
  for /F "usebackq delims=" %%I in ("%APPDATA%\%~n0.ini") do set "%%I"
) else (
  set "cntr=0"
)
                         
rem cntr is %cntr%                        
set /a "cntr+=1"
rem cntr is %cntr%                        

if  %cntr% LEQ 10  goto under
    echo Count exceeded 10
    set cntr=0
:under
rem cntr is %cntr%   
rem write back out to cntr file
>"%APPDATA%\%~n0.ini" echo cntr=%cntr%

这将导致以下输出:

c:\>test-pers-counter.cmd
c:\>rem read in existing cntr
c:\>if exist "C:\Users\***\AppData\Roaming\test-pers-counter.ini" (for /F "usebackq delims=" %I in ("C:\Users\***\AppData\Roaming\test-pers-counter.ini") do set "%I" )  else (set "cntr=0" )
c:\>rem cntr is 0
c:\>set /A "cntr+=1"
c:\>rem cntr is 1
c:\>if 1 LEQ 10 goto under
c:\>rem cntr is 1
c:\>rem write back out to cntr file
c:\>echo cntr=1 1>"C:\Users\***\AppData\Roaming\test-pers-counter.ini"

---------SNIP additional runs for count 1 through 9------------------

c:\>test-pers-counter.cmd
c:\>rem read in existing cntr
c:\>if exist "C:\Users\***\AppData\Roaming\test-pers-counter.ini" (for /F "usebackq delims=" %I in ("C:\Users\***\AppData\Roaming\test-pers-counter.ini") do set "%I" )  else (set "cntr=0" )
c:\>set "cntr=10"
c:\>rem cntr is 10
c:\>set /a "cntr+=1"
c:\>rem cntr is 11
c:\>if 11 LEQ 10 goto under
c:\>echo Count exceeded 10
Count exceeded 10
c:\>set cntr=0
c:\>rem cntr is 0
c:\>rem write back out to cntr file
c:\>echo cntr=0 1>"C:\Users\***\AppData\Roaming\test-pers-counter.ini"
c:\>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2012-06-13
    • 1970-01-01
    • 2016-01-12
    • 2011-06-24
    • 2015-10-06
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多