我希望借助批处理程序在我的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”命令的延迟“访问被拒绝”输出?
非常感谢你提前!!!
答案 0 :(得分:3)
使用
net start Apache2.2 2>&1 | find /i "%search_string%" > nul
以便将STDERR与标准输出联系起来。