Войти

Показать полную графическую версию : Поиск строки в файле


tmpnikl
01-11-2013, 06:19
Помогите написать bat файл, мне надо проверить есть ли строка в файле
ping -w 200 -n 2 server >x
find "TTL" x
А дальше не знаю, как продолжить...
если есть строка TTL
то %windir%\explorer.exe /n, \\server
else
echo No server

Elven
01-11-2013, 09:31
после find используй if errorlevel
например так

ping -w 200 -n 2 server >x
find "TTL" x
if errorlevel 0 (
%windir%\explorer.exe /n, \\server
exit /b
)
echo No server

правда я не понимаю зачем это через файл делать, уровень errorlevel прекрасно возвращает и ping, а если сервер доступен, то он и так доступен, даже не ясно зачем целых два пакета. это будет выглядеть приблизительно так:
ping -w 200 -n 1 server
if errorlevel 0 (
%windir%\explorer.exe /n, \\server
exit /b
)
echo No server

Iska
01-11-2013, 09:42
Elven, искать TTL нужно, ибо одного errorlevel недостаточно. tmpnikl, примеры неоднократно были, поищите по словосочетаниям ping, find и TTL.

tmpnikl
05-11-2013, 03:57
спасибо....

Гуллипут
05-11-2013, 20:54
Elven, а почему "if errorlevel 0" ? Так всегда будет выполняться только ветка внутри скобок.
Надо заменить на "if not errorlevel 1".
По крайней мере, вплоть до XP это так, поскольку команда вида "if errorlevel ..." проверяет не на точное равенство errorlevel указанному значению, а на "больше или равно".
Или можно написать "if %errorlevel%==0". Тогда проверка будет на равенство.
Таким образом, приходим к варианту:

ping -w 200 -n 2 server >x
find "TTL" x
if errorlevel 1 (echo No server) else (
%windir%\explorer.exe /n, \\server
exit /b
)

Поясню: я заменил "if not errorlevel 1" на "if errorlevel 1" с перестановкой веток, чтобы понятнее было, что написано. Потому что "if errorlevel 1" явно указывает на присутствие ошибки (при поиске строки) и на обработку этой ошибки, и не приходится мысленно переворачивать "ошибку" в "не-ошибку".

tmpnikl
08-11-2013, 04:56
Ещё раз спасибо за ответ, а то я тоже не мог понять, почему у меня при errorlevel 0, некорректно отрабатывал батник(при двух разных исходах, все равно выполнялась первая ветка), по интуиции стал ставить в начале 1, и вроде было нормально, непонятно, но работало, а теперь стало понятно почему так...правда не совсем понятна тавталогия ошибка в не обшибку, но суть понятна, в начале надо ставить проверку на ошибки(1,2.. и т.д.), и рассматривать эту ветку...

Да, совсем забыл..., если можно, подскажите(для отработки батника), как можно проверить какой код получил errorlevel,
ну что-нибудь типа
echo "errorlevel="+str(errorlevel) (Здесь контектация строк, как сделать в батнике это сцепление строк пока не знаю)

Foreigner
08-11-2013, 07:30
как можно проверить какой код получил errorlevel »
Зачем здесь errorlevel? Просто:

ping -n 1 server | 1>nul findstr /i "ttl=" && (

%windir%\explorer.exe /n, \\server

) || (

echo No server

)

tmpnikl
08-11-2013, 09:04
Просто разные программы могут запускаться, и без документации, и не только пинг, поэтому чтоб знать, что получает системная переменная errorlevel, и хотелось бы знать, какое там(errorlevel) значение с выводом на экран...

Гуллипут
08-11-2013, 20:11
Да, совсем забыл..., если можно, подскажите(для отработки батника), как можно проверить какой код получил errorlevel, »

echo errorlevel=%errorlevel%

Foreigner
08-11-2013, 21:18
tmpnikl:
Просто разные программы могут запускаться, и без документации, и не только пинг, поэтому чтоб знать, что получает системная переменная errorlevel, и хотелось бы знать, какое там(errorlevel) значение с выводом на экран... »
Есть успех == 0, есть ошибка == 1. Это общепринятые значения, а для всего остального должна быть документация. Ты тоже можешь установить errorlevel в батнике:

@echo off
exit /b 2013
А потом посмотреть 'echo %errorlevel%', разумеется в одной сессии. И, да, не все приложения возвращают код возврата.




© OSzone.net 2001-2012