Пакетное программирование: поиск заданной строки в выводе другой программы - возможно, с задержкой - PullRequest
1 голос
/ 01 июня 2011

Я бы хотел запустить службу Apache на моей Windows 7 с помощью пакетной программы .Это действительно простая задача, все, что мне нужно сделать, это напечатать:

net start Apache2.2

и нажмите Enter; НО у меня должны быть права администратора для этого, в противном случае я получаю некоторые сообщения об ошибках, подобные этому:

System error 5 has occurred.

Access is denied.

Все в порядке, но я хотел бы проверить выводКоманда «net start XY», и в случае, если выходные данные (или ответ) содержат упомянутую строку «Доступ запрещен», я хотел бы выполнить некоторые другие действия в другой части пакетной программы (вывести некоторые пользовательские сообщения об ошибках ивещи).
Я попытался проверить вывод с помощью команды НАЙТИ , как это ( ЭТО НЕ ДОЛЖНО РАБОТАТЬ, ЭТО ДОЛЖНО ):

@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

При запуске этой пакетной программы без прав администратора выводится упомянутое «Доступ запрещен», поэтому следует перейти к метке «получил».К сожалению, он не работает нормально, он переходит к «not_found», что означает, что он не нашел данную строку («Доступ запрещен»).

Возможно, проблема в том, что

net send XY

команда отправляет вывод «Доступ запрещен» с небольшой задержкой, сразу после проверки прав администратора, и функция find больше не заботится об этом.Но это просто предположение, я не знаю реального объяснения проблемы.

НО код выше работает, когда я создаю еще одну небольшую пакетную программу, которая просто повторяет строки выше с «AccessЗапрещено "строка.Итак, другая маленькая пакетная программа, которая показывает, что команда '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 Ответ

3 голосов
/ 01 июня 2011

Используйте

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

, чтобы привязать STDERR к стандартному выходу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...