创建一个在 windows CMD 文件运行之间持续存在的计数器?
Create a counter that persists between runs of a windows CMD file?
在 Windows Server 2008r2 环境中,我有 CMD 文件(不是 Powershell)运行 作为计划任务。我正在寻找一种实现逻辑的方法:
“如果此错误条件在该命令的过去十个 运行 中都发生过,请执行某些操作(例如发送短信)”
所以我想实现一个持久计数器来存储来自 CMD 之前 运行 的错误计数。
我在系统环境中搜索设置值,(SETX),但它似乎生效较晚并且有其他缺点。
或者,可以通过写入文件 1.txt、2.txt 等来实现持久计数器,但这看起来既复杂又难看。
这些方法中的任何一种都可能在足够的时间和精力下工作,但我想我会在这里检查一下,以防有人以前做过类似的事情。有没有人有更优雅的方法来实现一个计数器,其状态在 windows CMD 文件的单独 运行 之间持续存在?
通常当我写完一个问题时,我会看到答案已经显示在类似问题中,但在这种情况下我没有,所以我会继续post。
@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:\>
在 Windows Server 2008r2 环境中,我有 CMD 文件(不是 Powershell)运行 作为计划任务。我正在寻找一种实现逻辑的方法: “如果此错误条件在该命令的过去十个 运行 中都发生过,请执行某些操作(例如发送短信)”
所以我想实现一个持久计数器来存储来自 CMD 之前 运行 的错误计数。
我在系统环境中搜索设置值,(SETX),但它似乎生效较晚并且有其他缺点。 或者,可以通过写入文件 1.txt、2.txt 等来实现持久计数器,但这看起来既复杂又难看。
这些方法中的任何一种都可能在足够的时间和精力下工作,但我想我会在这里检查一下,以防有人以前做过类似的事情。有没有人有更优雅的方法来实现一个计数器,其状态在 windows CMD 文件的单独 运行 之间持续存在?
通常当我写完一个问题时,我会看到答案已经显示在类似问题中,但在这种情况下我没有,所以我会继续post。
@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:\>