在最不受欢迎的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
答案 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)
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%
我已将此标记为社区维基,因为问题仍在等待答案。