批量编程:在另一个程序中找到给定的字符串 - 可能是延迟 - 输出

时间:2011-06-01 15:15:19

标签: windows batch-file

我希望借助批处理程序在我的Windows 7 启动Apache服务。这是一个非常简单的任务,我所要做的就是输入:

net start Apache2.2

然后按Enter键; 但我必须拥有管理员权限才能这样做,否则我会收到一些错误消息:

System error 5 has occurred.

Access is denied.

没关系,但我想查看“net start XY”命令的输出,如果输出(或响应)包含提到的“Access is denied”字符串,那么我想在批处理程序的另一部分做一些其他事情(输出一些自定义错误消息和东西)。
我尝试用这样的FIND命令检查输出(它不按照它应该的方式工作):

@echo off
set search_string=Access is denied
echo We are looking for this string: "%search_string%"
rem set errorlevel =
net start Apache2.2 | find /i "%search_string%" > nul
echo The errorlevel number is: "%ERRORLEVEL%"
if %ERRORLEVEL% EQU 0 goto gotcha
if %ERRORLEVEL% EQU 1 goto not_found
if %ERRORLEVEL% EQU 2 goto para

:gotcha
echo OK, found it
echo So maybe you don't have the rights to do so...
goto end

:not_found
echo String not found...
echo So this would mean there are no problems related to admin-rights... but YES, there are... :-S
goto end

:para
echo Something's not OK...
goto end

:end
echo -- END --
pause

在没有管理员权限的情况下启动此批处理程序,它输出提到的“访问被拒绝”,因此它应该跳转到“gotcha”标签。不幸的是它不能正常工作,它跳转到“not_found”,这意味着它没有找到给定的字符串(“访问被拒绝”)。

也许问题是那个

net send XY

命令在检查管理员权限后发送“访问被拒绝”输出稍微延迟,并且发现不再关心它。但这只是猜测,我不知道问题的真正解释。

但是当我创建另一个小批量程序时,上面的代码才能正常工作,这个程序只是简单地用“访问被拒绝”字符串回显上面的行。所以另一个小批处理程序,它显示'find'命令可以像上面那样编写,就像这样:

@echo off
echo.
echo System error 5 has occurred.
echo.
echo Access is denied. blabla
echo.

我保存了这个名为“write_accessdenied_stuff.bat”的文件。

在那之后,我尝试了上面的代码,但是我写了这个代码而不是“net send XY ....”行:

write_accessdenied_stuff.bat | find /i "%search_string%" > nul

所以代码的开头就像这样改变了, IT WORKS

@echo off
set search_string=Access is denied
echo We are looking for this string: "%search_string%"
write_accessdenied_stuff.bat | find /i "%search_string%" > nul
..........
..........

使用这个,find命令将errorlevel设置为0,这意味着它已找到给定的字符串,因此程序的执行跳转到“gotcha”标签。

那么如何才能找到“net start XY”命令的延迟“访问被拒绝”输出?

非常感谢你提前!!!

1 个答案:

答案 0 :(得分:3)

使用

net start Apache2.2 2>&1 | find /i "%search_string%" > nul

以便将STDERR与标准输出联系起来。