Анализ результатов работы команды, программы

Анализ результатов работы команды, программы


Анализ результатов работы команд, программ на ошибки при работе

Сокращенная форма проверки ошибки выполнении команды


copy C:\tmp\file1.txt D:\tmp\*.*|| Echo Произошла ошибка
copy C:\tmp\file1.txt D:\tmp\*.*&&Echo Успешное копирование

Для более детальной проверки как правило используют проверку значения переменной errorlevel

... copy prot.log "%KONVA_IN%\prot.log" if errorlevel 0 ( echo "File prot.log copy to KONVA" ) else ( echo ERROR copy file prot.log to KONVA +++++++++ pause pause exit )


Программы могут возвращать различные коды возврата. Иногда документация на эти программы об этом упоминает. Как правило, при нормальном завершении программ код возврата 0.

Анализ возвращаемых значений команд, программ

Для начала - простой пример.

FOR /F "usebackq" %%i IN (`hostname`) DO SET MYVAR=%%i


В переменную MYVAR запишется имя компьютера, с которого запущена команда.
Приведено в качестве примера. Так как аналогичный результат можно было получить и более просто (смотрите таблицу Список системных и локальных переменных на странице Общие сведения о командной оболочке).
set MYVAR=%COMPUTERNAME%


Во многих случаях удобно анализировать результат работы одной команды при помощи другой команды.
Это не так страшно, как написано )).
Начнем с несложных примеров.

ping ya.ru /n 1 | find "TTL">nul if %ERRORLEVEL% NEQ 0 ( rem Действия, если ping был неудачным ) else (
rem Действия, в случае удачного завершения ping )


Здесь результат работы команды ping передается (конвейер) программе find для поиска в них подстроки "TTL".
Проверку доступности ресурса можно осуществить и анализируя код завершения команды ping аналогично приведенному выше примеру с командой copy.

<nul ping ya.ru && echo Yandex: SUCCESS || echo FAILURE


В следующем примере на основе вывода команды ping переменная получает значение IP компьютера, с которого запущен bat файл.

FOR /f "tokens=2 delims=[]" %%a in ^ ('"ping /a /n 1 %COMPUTERNAME% |find "[""') do set ip=%%a


Здесь приведен простой пример. У компьютера может быть несколько IP.

Пример анализа работы утилиты

FOR /F "usebackq" %%i IN (`md5sum.exe -t fin.txt`) DO ( set rrr=%%i )


Осуществляется запуск программы расчета контрольных сумм файла
с параметрами и последующий анализ результата.

Еще один пример. Для файлов из папки по адресу PAHTFROM, рассчитываются контрольные суммы (md5) при помощи утилиты fciv.exe и результат для каждого такого файла выводится на экран.
For %%I in (%PAHTFROM%\*.*) DO ( set FNAME=%%~nxI FOR /f "tokens=1 delims= " %%a in ('" %PATHUTIL%\fciv.exe %%I ^| find /i "!FNAME!""') do set HSH=%%a echo %%I !HSH! )


Программный анализ результатов работы команды DIR

FOR /F "tokens=1,2 usebackq" %%I IN (`dir %OTKUDA%\*.* /A:-D /O:D`) DO ( SET REW=%%I if "!REW:~2,1!" == "." ( if "!REW:~5,1!" == "." ( SET DDD=%%I SET TTT=%%J ) ) )


Переменные DDD и TTT получат значение соответственно даты и времени создания/изменения последнего (по времени) файла в директории
%OTKUDA%.

В следующем примере мы получаем имена файлов в текущей директории, в имени (или расширении) которых есть подстрока TST.


FOR /F "usebackq" %%i IN (`dir /b | find "TST"`) DO ( echo %%i )


Рассмотрим интересный пример, когда удобно произвести обработку собственной статичной команды echo.

:Day2Name %d% day :: By: Ritchie Lawrence, 2002-10-04. Version 1.0 :: Func: Returns the day of week from the day number, 1=Monday, 7=Sunday. :: For NT4/2000/XP/2003. :: Args: %1 day number to convert to name of day of week, 1 to 7 (by val) :: %2 var to receive name of day of week (by ref) ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: FOR /f "tokens=%1" %%a ^ in ('echo Понедельник Вторник Среда Четверг Пятница Суббота Воскресение') ^ do SET %2=%%a exit /b 0


В какой-то мере приведенный выше пример можно рассматривать как имитацию работы с массивом констант. Более подробно об имитации работе с массивами смотрите на странице этого проекта Массивы в bat / cmd файлах.
-------------------------------------------------------------------------------------------------------
Следующий пример - получение данных из реестра средствами bat/cmd.
Для этого используется обработка вывода команды REGEDIT или REG. В качестве примера из реестра получают данные о коде страны, наименовании страны и о языке.

:: REGEDIT trick by Rob van der Woude :: Export International settings from registry to a temporary file SET TMPREG=%Temp%\international.reg START /W REGEDIT /E %TMPREG% "HKEY_CURRENT_USER\Control Panel\International" :: Read several lines from the temporary files :: and store these settings as environment variables FOR /F "tokens=1* delims==" %%A IN ('TYPE %TMPREG% ^| FIND "iCountry"') ^ DO SET iCountry=%%B ECHO iCountry=%iCountry% FOR /F "tokens=1* delims==" %%A IN ('TYPE %TMPREG% ^| FIND "sCountry"') ^ DO SET sCountry=%%B ECHO sCountry %sCountry% FOR /F "tokens=1* delims==" %%A IN ('TYPE %TMPREG% ^| FIND "sLanguage"') ^ DO SET sLanguage=%%B ECHO sLanguage %sLanguage% :: Remove temporary file DELDEL %TMPREG%


Еще один пример получения данных из реестра. В данном примере извлекается дата последнего удачного обновления Windows.

:: Written by Rob van der Woude :: http://www.robvanderwoude.com SETLOCAL SET RegKey=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion SET RegKey=%RegKey%\WindowsUpdate\Auto Update\Results\Install FOR /F "skip=1 tokens=2*" %%A IN ('REG Query "%RegKey%" /v "LastSuccessTime"') ^ DO SET LastWUpd=%%B ECHO Last successful Windows Update: %LastWUpd%



-------------------------------------------------------------------------------------------------------
В следующем примере анализируется вывод команды
MOUNTVOL и NET USE.
Соответственно, определяются свободные и занятые буквы локальных и сетевых дисков.
Для анализа вывода в качестве фильтра используется команда FINDSTR. Достаточно интересный пример, стоит потратить время,
что бы разобраться, как он работает.


@ECHO OFF :: FREEDRIVELETTER :: Small batch file to list all unused drive letters :: (works ONLY on 2000/XP/2003) :: by Rob van der Woude :: from an idea and minor fixes by Jacopo Lazzari :: http://www.robvanderwoude.com :: Not for Windows 95/98/ME/NT4 IF NOT "%OS%"=="Windows_NT" EXIT VER | FIND "Windows NT" >NUL && EXIT SETLOCAL ENABLEDELAYEDEXPANSION SET ALLDRIVES=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z SET BUSYDRV= SET FREEDRV= :: List drive letters for physical drives FOR %%A IN (%ALLDRIVES%) DO ( FOR /F %%B IN ('MOUNTVOL %%A: /L ^|FINDSTR /C:"\\"') DO ( SET BUSYDRV=!BUSYDRV!,%%A: ) ) :: List drive letters for network drives FOR /F "tokens=2" %%A ^ IN ('NET USE ^|FINDSTR /R /C:" [A-Z]: "') ^ DO SET BUSYDRV=!BUSYDRV!,%%A :: Remove leading comma SET BUSYDRV=%BUSYDRV:~1% :: Remove backslashes SET BUSYDRV=%BUSYDRV:\=% :: Check which drive letters aren't used and :: list them as free drive letters FOR %%A IN (%ALLDRIVES%) DO ( ECHO.%BUSYDRV% | FIND "%%A:" >NUL IF ERRORLEVEL 1 SET FREEDRV=!FREEDRV!,%%A: ) :: Remove leading comma SET FREEDRV=%FREEDRV:~1% :: Display result SET BUSYDRV FOR %%A IN (%BUSYDRV%) DO ECHO %%A BUSY SET FREEDRV FOR %%A IN (%FREEDRV%) DO ECHO %%A FREE ENDLOCAL





Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).






  TopList Rambler Top100 own counter Valid XHTML 1.0 Strict Valid CSS Rambler Top100

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка link О авторе

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка Ссылки О авторе Отправить сообщение Карта сайта Поиск по сайту Главная страница

Copyright © 1999 - 2017  Бронислав Краснер