0

是时候在最不利于 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%这种情况将是1taskkill如果调用杀死进程时进程不存在,则退出代码为128; 在这种情况下是%errorresult% will be129`。

我想%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%也很容易

4

3 回答 3

1

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

SETLOCAL ENABLEDELAYEDEXPANSION

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

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

这是因为在您的 for 循环中 %errorresult% 将始终在解析时使用该值。!错误结果!将在运行时使用该值。

于 2013-08-16T14:04:41.947 回答
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 会更有意义。

于 2013-08-16T21:12:46.530 回答
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,因为该问题仍在等待答案。

于 2013-08-16T14:17:31.873 回答