Программизм |
|
|
|
Batch-файлы в Windows NT, часть 2Посвящается Сергею Г. и всем остальным, у кого заклинание RTFM не выбито золотом по чёрному над рабочим местом. Сразу предупреждаю, что практически весь материал, приведённый здесь, можно найти на своём компьютере, выдав в командной строке несколько нехитрых команд: if /? for /? set /? call /? Мало того, если нажать кнопку Пуск, затем Справка, а потом в Справочных сведениях найти Главную страницу справочника по командам, можно узнать ещё больше интересного. Пытливый же ум может прочитать ещё и учебник по командному процессору Windows NT. Здесь же речь пойдёт о скриптах, которые облегчают жизнь лично мне. Естественно, с краткими комментариями. Итак, Поиск фильмов в корпоративной сетиОбратите внимание, в командных файлах запрещено разбивать команду на несколько строк. В этом листинге и далее если строка начинается с пробелов, то она на самом деле является продолжением предыдущей. Сделано это с единственной целью — уместиться в окно броузера. @echo off ver|find "Версия" >nul if %ERRORLEVEL%==0 set disk=Диск& goto version_found ver|find "Version" >nul if %ERRORLEVEL%==0 set disk=Disk& goto version_found echo Sorry, unknown language. Bye. goto :EOF :version_found for /F "tokens=1 delims= " %%m in ('net view^|find "\\"') do call :invsrv %%m goto :EOF :invsrv for /F "tokens=1" %%d in ('net view %1^|find "%disk%"') do call :invdir %1\%%d goto :EOF :invdir dir /b /s "%1\*.avi" "%1\*.mpg" "%1\*.mpeg" 2>nul goto :EOF Мы в такие шагали дали, С первой строчкой всё должно быть более-менее понятно. Вторая группа предназначена для определения версии системы — русская или английская. К сожалению, от этого зависит вывод некоторых команд, в частности,
Следующая группа команд представляет собой цикл по всем компьютерам сети. Мы получаем список командой
Для каждого компьютера вызывается подпрограмма с именем Дальше для каждого компьютера читается список открытых каталогов, а для каждого каталога вызывается команда Говорят, что на эту тему Есть ли недостатки у данного скрипта? Безусловно. Например, он не будет работать для открытых каталогов, в именах которых содержится пробел. Можно исправить это, написав во втором цикле net view %1 | gawk " /Disk/{ l=\"\"; for(i=1;$i!=\"Disk\";i++) l=l \" \" $i; print l; }" Для английской Windows это будет работать, а вот для русской — увы. Кстати, не забудьте, что все русские буквы в приведённом выше скрипте — в кодировке OEM, т.е. CP-866. Приятного просмотра! Архивирование модифицированных файловИногда требуется создать архив, куда попали бы свежеисправленные файлы. Как правило, эта задача решается тривиально — при изменении файла у него автоматически устанавливается атрибут Archive, а потом архиватор архивирует файлы с установленным атрибутом, а сам атрибут сбрасывает. И вдруг оказалось, что InfoZip этого не умеет! Никто не собирается спорить с тем, что Rar сжимает файлы лучше, а PkZip, возможно, понимает атрибуты. Просто для закачки, например, файлов по http на этот сайт архив обязательно должен быть zipом. А PkZip, что бы там ни говорили отдельные товарищи, программа коммерческая, т.е. не бесплатная. Не стоит отчаиваться, не всё так плохо. InfoZip умеет добавлять в архив файлы, измененные не раньше определённой даты. Единственное, что надо учесть, что в России принято писать дату как ДД.ММ.ГГГГ, а в Америке — MM.DD.YYYY Имея на руках вышеприведённые сведения, пытливый ум напишет что-нибудь вроде следующего: @echo off del /f site.zip >nul 2>nul for /f "tokens=2,3,4 delims=. " %%i in ('date /t') do set curdate=%%j%%i%%k zip -9Xr -t %curdate% site * -x update.cmd и будет абсолютно прав. Нумерация файлов в каталогеЕщё одна задача. В каталоге имеется куча файлов, которые надо переименовать так, чтобы номера были последовательными числами. В качестве параметра скрипту будем передавать маску файлов и первый номер. Изучив вышеприведённые примеры, любой неленивый программист после некоторого раздумья напишет: @echo off if .%1==. goto usage set n=%2 if .%n%==. set n=1 set tempdir=$tmp$.$x$ mkdir %tempdir% for %%i in (%1) do call :renfile %%i move %tempdir%\%1 . >nul rmdir %tempdir% goto :EOF :renfile move %1 %tempdir%\%n%%~x1 > nul set /a n+=1 goto :EOF :usage echo USAGE RENUMBER *.HTM ^<first number^> Потом, правда, возникнет вопрос, нельзя ли вместо вызова подпрограммы Правда, можно сделать и так, чтобы значения переменных подставлялись при каждой итерации цикла. Для этого надо заключить переменную не в проценты, а в восклицательные знаки, то есть написать HKCU\Software\Microsoft\Command Processor\DelayedExpansion HKLM\Software\Microsoft\Command Processor\DelayedExpansion Кстати, вот ещё одна нехитрая команда, которая позволит узнать больше о внутреннем мире вашего компьютера: cmd /?
Злые баги не остановишь, Из особенностей кода хотелось бы отметить присваивание с вычислением ( Узнать длину файлаЗадача сформулирована предельно просто. Проигнорировать файл, если его не существует или он нулевой длины (или ненулевой). Тот, кто детально разобрался с инструкцией :list_file for /f "tokens=3" %%i in ('dir /-C %1^|find "%1"') do set FILELEN=%%i goto :EOF Нельзя не согласиться с товарищем, если ничего, кроме Windows NT 4 он не видел. Но настоящий программист, у которого под рукой Windows 2000 и которого данная статья побудила RTFM, поступит так: :list_file set FILELEN=%~z1 goto :EOF ВыводыКомандный язык Windows NT — всё ещё корявый и хитрый, но уже достаточно мощный инструмент, которым можно и нужно пользоваться в повседневной жизни. Успехов вам, товарищи! 10.01.2003 * Здесь и далее стихи Андрея Макаревича и немного мои. |
ПоискСм. такжеИменно им призван помочь описанный здесь скрипт, сохраняющий письма с бесплатных ящиков на локальный диск.... »»» во-первых, процедуру копирования нужно вызвать из программы на VisualBasic, а во-вторых, у пользователя нет прав на запись в каталог... »»» как правило обрабатывать надо не сегодняшние файлы, а файлы за несколько дней назад... »»» Рекомендую
e.g.Orius Copyright noticeъ) Все материалы, размещённые на странице, являются неотъемлемой собственностью автора с вытекающими отсюда правами, как ©, так и (ъ). Некоммерческое их распространение всячески приветствуется, разумеется, при условии сохранения ссылки на оригинал. Что касается коммерческого использования — пишите письма, договориться можно всегда. Удивительное рядом
Пишите письма
Счётчики |