АНАЛИЗ РЕЗУЛЬТАТОВ РАБОТЫ КОМАНДЫ, ПРОГРАММЫ
Анализ результатов работы команд, программ на ошибки при работе
Сокращенная форма проверки ошибки выполнении команды
copy C:\tmp\file1.txt D:\tmp\*.*|| Echo Произошла ошибка
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 )
rem Действия, в случае удачного завершения ping )
Здесь результат работы команды ping передается (конвейер) программе find для поиска в них подстроки "TTL".
Проверку доступности ресурса можно осуществить и анализируя код завершения команды ping аналогично приведенному выше примеру с командой copy.
<nul ping ya.ru && echo Yandex: SUCCESS || echo FAILURE
В следующем примере на основе вывода команды ping переменная получает значение IP компьютера, с которого запущен bat файл.
Здесь приведен простой пример. У компьютера может быть несколько 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
-------------------------------------------------------------------------------------------------------
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь