Отправляет email-рассылки с помощью сервиса Sendsay

[TC] батник

Привет, друзья. Вопрос к специалистам, знающим синтаксис бат-файлов в
windows. С помощью конструкции if ...goto в этих файлах можно организовать
ветвление, т.е. выполнение или игнорирование команд в зависимости от
определенных обстоятельств. и вся штука в том, что это за обстоятельства
такие. еще по dos я помню два типа условий: exist (наличие определенного
файла или папки) и errorlevel (код ошибки). Вопрос заключается в следующем:
Если точно известно, что определенная команда возвращает определенное
значение в определенном случае, можно ли сделать так, чтобы если эта команда

возвращает это значение, то происходит то-то и то-то? возврат является
текстовой строкой
(Hooks are installed)..

Заранее спасибо.
Эдик. Новокузнецк.
winks***@r*****.ru

Ответить   Sat, 18 Feb 2006 20:07:51 +0700 (#517257)

 

Ответы:

Ответ на письмо от 18.02.2006
Здравствуйте, эдуард,

Ну, ещё можно и параметры бат-файлов проверять. Часто бат-файлу
требуется внешний параметр. Чтобы блокировать отсутствие параметра
можно использовать if '%%1' = '' goto err_1
А поскольку команда for может порождать массу всяких значений для
просматриваемого списка, то очень много чего ещё можно анализировать.

Если программа выдаёт текст на стандартную консоль (stdout в терминах
Си), а обрабатывающая программа принимает входные данные со
стандартной консоли ввода (stdin в терминахСи), то передавать
текстовую строку, а хотя бы и файл, можно через так называемый пайп.
Пишется: прог1 | прог2
Но вот принимает ли бат файл stdin, я не знаю.

--
С наилучшими пожеланиями
Владимир Лукьянов
Москва
mailto:lvu20***@y*****.ru

Ответить   Sat, 18 Feb 2006 19:46:43 +0300 (#517348)

 

Добрый день, Владимир Лукьянов и все участники рассылки.

Original Message > Если программа выдаёт текст на стандартную консоль (stdout в терминах

Прошу прощения владимир, Можно то же самое, но порусски? Что такое stdin, я
не знаю, но пакетный файл, а точнее стандартные команды операционной
системы, которые в этом файле используются, выдают сообщения на стандартную
консоль. Я так понимаю, что stdout и stdin- это функции языка си. Я точно
знаю, что использовать в пакетнике выводы некоторых команд точно возможно.
Например это касается команды time и date. Формат вывода точно такой же, за
исключением того факта, что там три строки, а сдесь однастрока, содержащая
три цифры, разделенные точками. Пишется это примерно так:

set time=%time:~-10%

значение: Переменная "time" устанавливается в значение текущей даты. Это
используется для сохранения значения текущей даты, если вдруг тебе нужно для

чего-то ее изменить на какое-то время, а потом восстановить. Очень полезная
возможность например для работы с программами, которые работают только
какое-то время, а потом предлагают, например, обновиться, а тебе оно не
надо.

Эдик. Новокузнецк.
winks***@r*****.ru

Ответить   Sun, 19 Feb 2006 12:55:14 +0700 (#517488)

 

Здравствуйте, Эдуард.
Не ленитесь сделать так:
help if > 1.txt

Вот результат:
if Оператор условного выполнения команд в пакетном файле.

IF [NOT] ERRORLEVEL число команда
IF [NOT] строка1==строка2 команда
IF [NOT] EXIST имя_файла команда

NOT Обращает истинность условия: истинное условие
становится ложным, а ложное - истинным.

ERRORLEVEL число Условие является истинным, если код возврата последней
выполненной программы не меньше указанного числа.

строка1==строка2 Это условие является истинным, если указанные строки
совпадают.

EXIST имя_файла Это условие является истинным, если файл с указанным
именем существует.

команда Задает команду, выполняемую при истинности условия.
За этой командой может следовать ключевое слово ELSE,
служащее для указания команды, которая должна
выполняться в том случае, если условие ложно.

Предложение ELSE должно располагаться в той же строке, что и команда,
следующая за ключевым словом IF. Например:

IF EXIST имя_файла. (
del имя_файла.
) ELSE (
echo имя_файла. missing.
)

Следующий пример содержит ОШИБКУ, поскольку команда del должна
заканчиваться переходом на новую строку:

IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. missing

Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна
Располагаться в той же строке, что и команда, следующая за IF:

IF EXIST имя_файла. del имя_файла.
ELSE echo имя_файла. missing

Вот правильный пример, где все команды расположены в одной строке:

IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. missing

Изменение команды IF при включении расширенной обработки команд:

IF [/I] строка1 оператор_сравнения строка2 команда
IF CMDEXTVERSION число команда
IF DEFINED переменная команда

где оператор_сравнения принимает следующие значения:

EQL - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно

а ключ /I, если он указан, задает сравнение текстовых строк без учета
регистра. Ключ /I можно также использовать и в форме строка1==строка2
команды IF. Сравнения проводятся по общему типу данных, так что если
строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа,
после чего выполняется сравнение чисел.

Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение
сравнивается с внутренним номером версии текущей реализации расширенной
обработки команд. Первая версия имеет номер 1. Номер версии будет
увеличиваться на единицу при каждом добавлении существенных возможностей
расширенной обработки команд. Если расширенная обработка команд отключена,
условие CMDEXTVERSION никогда не бывает истинно.

Условие DEFINED применяется подобно условию EXISTS, но принимает в качестве
аргумента имя переменной среды и возвращает истинное значение, если эта
переменная определена.

Строка %ERRORLEVEL% будет развернута в строковое представление текущего
значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется
переменная среды с именем ERRORLEVEL; в подобном случае подставляется
значение этой переменной. Например, с помощью данной строки можно выполнить
следующее:

goto answer%ERRORLEVEL%
:answer0
echo Получен код возврата 0
:answer1
echo Получен код возврата 1

Допускается и применение описанных выше операторов числового сравнения:

IF %ERRORLEVEL% LEQ 1 goto okay

Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную
CMD.EXE до любой обработки, за исключением ситуации, когда уже определена
переменная среды с именем CMDCMDLINE, в подобном случае подставляется
значение этой переменной.

Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой
текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется
переменная среды с именем CMDEXTVERSION; в подобном случае подставляется
значение этой переменной.

Ответить   "i_chay" Sun, 19 Feb 2006 11:49:31 +0400 (#517517)

 

Добрый день ichay.

Original Message > Не ленитесь сделать так:

Да я так и сделал, но все равно не получил ответа на свой вопрос. Объясните
мне лучше пожалуйста следующую часть текста:

Не знаю как у вас, а у меня это четыре разные строки не только в почтовике,
но и в выводе команды help. Кроме того конструкция if ... else почему-то
отказывается работать на моем компьютере. Мне пришлось переписать алгоритм в

привычном досовском стиле и, вы знаете, помогло. В чем могла бы быть
проблема?

Эдик. Новокузнецк.
winks***@r*****.ru

Ответить   Sun, 19 Feb 2006 17:10:40 +0700 (#517555)

 

Здравствуйте, Эдуард.

Не понял, зачем у вас стоят точки после имя_файла, и Вы не поставили закрывающую
круглую скобку. Должно быть так (здесь более
универсальный вариант, использующий переменную %file_name%):

set file_name=some_file_name
IF EXIST %file_name% (
del %file_name%
) ELSE (
echo %file_name% missing.)

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

Прочитав ваш батник, я вспомнил один случай. Начальник отдела программных систем
изучает команды консоли и вот уже пятый раз
набирает строку:
delete myfile.txt
и пятый раз получает ошибку:
"delete" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Наконец он обращается к своему подчиненному (программисту) и тот сообщает, что
надо набирать:
del myfile.txt
"Ба!" - удивляется начальник. - "Три буквы лишних и ничего уже не работает!.."
Набирает эту строку и убеждается, что она выполнена без ошибок. Потом создает
bat-файл и пишет туда эту строку. Запускает батник и
с удивлением (в полной прострации) объявляет: "А в бат-файле команда пишет, что
не удается найти файл ..."
С уважением, Анатолий.

Ответить   "i_chay" Sun, 19 Feb 2006 16:19:45 +0400 (#517580)

 

Здравствуйте, Эдуард,

я
stdin и stdout - это логические псевдоустройства ввода/вывода
операционной системы ДОС. Программа может направлять вывод на
конкретное физическое устройство, а может - на логическое устройство
stdout, которое сам ДОС связывает с определённым физическим
устройством. Соль в том, что эту связью пользователь может управлять.
Например, переключить стандартный вывод на принтер или в файл.
Аналогично со вводом. Так вот, если программы поддерживают эти
стандартные каналы ввода/вывода, то вывод одной программы можно
подать на ввод другой.

Вы совершенно верно отметили, что бат-файл для вывода использует
stdout. А вот принимает ли он stdin я сомневаюсь. С этим можно
поэкспериментировать. Таким образом, я не могу однозначно ответить на
Ваш вопрос.

--
С наилучшими пожеланиями
Владимир Лукьянов
Москва
mailto:lvu20***@y*****.ru

Ответить   Sun, 19 Feb 2006 12:11:00 +0300 (#517538)