在`cmd`中的文件中的每一行上执行整数求和

时间:2013-08-16 13:37:54

标签: batch-file cmd arithmetic-expressions

在最不受欢迎的shell cmd.exe中使用命令行fu的时间。

如何执行文件中包含的整数求和?

您可以考虑以下方法:

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中所有行中包含的所有整数的总和。我该怎么做?

[更新]

感谢Stephen在下面的回答,我有一个如下的最终脚本,我希望将其包含在其他用户的未来参考中:

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

我也刚刚意识到这有点倒退,因为我应该检查进程是否在对不存在的进程采取任何无效操作之前运行,但问题仍然得到解决。 Finding if a specific running process exists with a batch script actually uses a similar method of checking the %errorlevel% is also quite easy

3 个答案:

答案 0 :(得分:1)

for循环中,您需要delayed expansion for your variables: 使用

SETLOCAL ENABLEDELAYEDEXPANSION

在批处理文件的开头 并将你的for循环更改为

for /F "tokens=*" %%G in (%temp%/kill_site.log) do set /A errorresult=%%G+!errorresult!

这是因为在你的for循环中,%errorresult%将始终使用Parse-time中的值。 !errorresult!将在运行时使用该值。

答案 1 :(得分:1)

Stephan的回答很好,但有一种简单的方法不需要延迟扩展。

SET / A命令自己扩展变量名,并且它总是使用当前值。

set /a errorresult=1
for /F "tokens=*" %%G in (%temp%/kill_site.log) do set /A errorresult=%%G+errorresult

或者更好

set /a errorresult=1
for /F "tokens=*" %%G in (%temp%/kill_site.log) do set /A errorresult+=%%G

注意 - 我不明白为什么你将errorresult初始化为1.我认为0会更有意义。

答案 2 :(得分:0)

这是一个非便携式解决方案,但它不是答案,但可以帮助将来遇到此问题的其他人:

taskkill /f /im rsync.exe
echo %errorlevel% > "%temp%/kill_site.log"
set /p res1=< "%temp%/kill_site.log"
echo > "%temp%/kill_site.log"
taskkill /f /im ssh.exe
echo %errorlevel% > "%temp%/kill_site.log"
set /p res2=< "%temp%/kill_site.log"
echo > "%temp%/kill_site.log"
taskkill /f /im 7za.exe
echo %errorlevel% > "%temp%/kill_site.log"
set /p res3=< "%temp%/kill_site.log"
echo > "%temp%/kill_site.log"
set /A errorresult=%res1% + %res2% + %res3%

我已将此标记为社区维基,因为问题仍在等待答案。