是时候在最不利于 shell 的命令行 fu 中使用了,cmd.exe
.
如何对文件中包含的整数进行求和?
您可能会考虑以下工作:
taskkill /f /im rsync.exe
echo %errorlevel% > %temp%/kill_site.log
taskkill /f /im ssh.exe
echo %errorlevel% >> %temp%/kill_site.log
taskkill /f /im 7za.exe
echo %errorlevel% >> %temp%/kill_site.log
set /a errorresult=1
for /F "tokens=*" %%G in (%temp%/kill_site.log) do set /A errorresult=%%G+%errorresult%
但是,它似乎%errorresult%
总是在for
循环期间for
循环之前的值。意思是,结果%errorlevel%
总是有 [最后一行的整数值%temp%/kill_site.log
] + [%errorlevel%
集合,即1
]。
在 提供的退出代码的情况下taskkill
,如果taskkill
成功杀死现有进程,退出代码是0
,那么导致%errorresult%
这种情况将是1
。taskkill
如果调用杀死进程时进程不存在,则退出代码为128
; 在这种情况下是%errorresult% will be
129`。
我想%errorresult%
成为 %temp%/kill_site.log
. 我该怎么做呢?
[更新]
感谢斯蒂芬在下面的回答,我有一个如下的最终脚本,我想包含它以供其他用户将来参考:
setlocal enabledelayedexpansion
taskkill /f /im rsync.exe
echo %errorlevel% > %temp%/kill_site.log
taskkill /f /im ssh.exe
echo %errorlevel% >> %temp%/kill_site.log
taskkill /f /im 7za.exe
echo %errorlevel% >> %temp%/kill_site.log
set /a errorresult=1
for /F "tokens=*" %%G in (%temp%/kill_site.log) do set /A errorresult=%%G+!errorresult!
if %errorresult% lss 255 sendmail.vbs && eventcreate /l application /so backup_scripts /t warning /id 1 /d "website rsync has to be killed because it was long running."
endlocal
它利用endlocal
.
我也刚刚意识到这有点倒退,因为我应该检查进程是否在对不存在的进程采取任何无效操作之前运行,但问题仍然得到解决。 使用批处理脚本查找是否存在特定的运行进程实际上使用类似的检查方法%errorlevel%
也很容易。