在“cmd”中对文件中的每一行执行整数求和



在最不利于fu的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%

但是,在for循环期间,%errorresult%似乎总是for循环之前的值。也就是说,得到的%errorlevel%总是具有[%temp%/kill_site.log中最后一行的整数值]+[%errorlevel%集合,即1]。

taskkill提供的退出代码的情况下,如果taskkill成功杀死现有进程,则退出代码为0,则在这种情况下得到的%errorresult%将为1。如果调用taskkill终止进程时进程不存在,则退出代码为128;在这种情况下是CCD_ 16 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

它使用CCD_ 19。

我也刚刚意识到这有点倒退,因为在对不存在的进程采取任何无效操作之前,我应该检查进程是否正在运行,但问题仍然得到了解决。使用批处理脚本查找是否存在特定的运行进程实际上使用了类似的检查%errorlevel%的方法也很容易。

for循环中,您需要对变量进行延迟扩展:使用

SETLOCAL ENABLEDELAYEDEXPANSION

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

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

这是因为在for循环%errorresult%中将始终在分析时使用该值!errorresult!将在运行时使用该值。

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更有意义

这里有一个不可移植的解决方案,但它不是答案,但可能会帮助未来遇到此问题的其他人:

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%

我已将此标记为社区wiki,因为该问题仍有待回答。

最新更新