Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 3

Автор: Angel_Ka
Дата сообщения: 20.05.2007 12:03
yurkesha
Сэнкс!
Пояснение
Цитата:
2>nul - при запросе значения из реестра не выводить текст ошибки если она случилась
мне куда более понятно чем
Цитата:
2>nul это перенаправление потока вывода 2 (stderr) в устройство nul - то есть в никуда...

Гранд сэнкс!

Автор: yurkesha
Дата сообщения: 20.05.2007 12:03
Elroir - да оттуда что все система работы c errorlevel не претерпела никаких изменений по сравнению с DOS... Вспомни как разбираются такие конструкции в DOS.
Добавлено:
wolf0425 - учите матчасть товарищ Администратор на локальной машине - возьмем ветку
Код: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root
Автор: Angel_Ka
Дата сообщения: 20.05.2007 12:14
Elroir, yurkesha и wolf0425
Гран мерси каждому! Вкупе получается ещё более доходчиво. Вэри плз за отзывчивость!

wolf0425

Цитата:
если юзеру не хватило прав на HKCU\Software\Far\users - это клиника, можно и ФАР не пускать и вообще лучше poweroff сразу делать

А вот это мне как то не понятно. О чём это ты?
Автор: Elroir
Дата сообщения: 20.05.2007 12:14
yurkesha
Может я чего-то не понимаю, но насколько я знаю, со времен DOS, код ошибки жестко задается в самой программе. Никогда не видел, чтобы использовалось добавление единицы.
Автор: wolf0425
Дата сообщения: 20.05.2007 12:17
yurkesha а ты ещё чего придумай, да?
в батнике проверялась отнюдь не ветка hklm, а вполне конкретная подветка hkсu, которую в следующей после удаления строчке - восстанавливали из файла.

обделался с %еrrorlevel% - так хоть умных людей послушай.


Добавлено:

Цитата:
если юзеру не хватило прав на HKCU\Software\Far\users - это клиника, можно и ФАР не пускать и вообще лучше poweroff сразу делать
А вот это мне как то не понятно. О чём это ты?

о чьих-то принципах

Цитата:
В принципе последнее действие построено не совсем верно - а что если удаление не получилось? Например не хватило прав...

- о том, что проверять код ошибки
Reg Delete HKEY_CURRENT_USER\Software\Far\Users\%Faruser% /F
- полностью бессмысленно. для всех, включая не-администраторов и прочих гостей.
Автор: yurkesha
Дата сообщения: 20.05.2007 12:23
wolf0425 - есть такое понятие универсальность кода... Не можешь или не хочешь обработать все исключения - универсального кода не будет.

Elroir - построй цепочку команд так чтоб несколько из них выдавали ошибку и выведи значение errolevel

Автор: wolf0425
Дата сообщения: 20.05.2007 12:25
yurkesha а есть ещё такое понятие как разумная достаточность...
Автор: yurkesha
Дата сообщения: 20.05.2007 12:30
Ты можешь гарантировать что человек впервые посетивший ветку не захочет воспользоваться твоим кодом для решения своих (вообще говоря совершенно отличных от текущих) задач? Я лично думаю что он скорее почитает ветку - найдет что-либо похожее на свою задачу и попробует применить...

Не понимаю почему ты так кипятишься? Вобщем данный вопрос здесь я обсуждать больше не буду - хочешь пофлеймить - добро пожаловать в личку....
Автор: wolf0425
Дата сообщения: 20.05.2007 12:31

Цитата:
построй цепочку команд так чтоб несколько из них выдавали ошибку и выведи значение errolevel

echo 123 |find "234"
echo 123 |find "234"
echo %errorlevel%
выдает, как и следовало ожидать, код 1

Автор: Elroir
Дата сообщения: 20.05.2007 12:32
yurkesha

Цитата:
построй цепочку команд так чтоб несколько из них выдавали ошибку и выведи значение errolevel

Ты ошибаешься - errorlevel перезаписывается после каждой команды - он зависит только от результата выполнения последней команды. Ничего к нему не прибавляется, иначе невозможно было бы понять, какая команда выдала ошибку.
Автор: Angel_Ka
Дата сообщения: 20.05.2007 12:34
Elroir, yurkesha и wolf0425!

Мальчики, только не ссортесь, плз. В любом случае вы мне очень сильно подсобили! Не предполагала, что в выходной будут такие плотные ответы. Я то ведь за вами не поспеваю...

yurkesha
А как бы ты эту конструкцию изобразил бы:

Код: reg query "Раздел\подрадел" 2>nul
if %errorlevel%==0 reg delete "Раздел\подраздел" /F >Nul
Автор: wolf0425
Дата сообщения: 20.05.2007 12:41
yurkesha

Цитата:
Не понимаю почему ты так кипятишься?

да просто я автор вполне конкретного батника, по которому Angel_Ka вопросы задавал...
и хотя времени на доработку накопившихся замечаний нет - за неплохой в общем-то батник и совершенно бессмысленую критику - обидно.

можешь написать лучше (батник целиком) - напиши, на форуме ФАРа много людей скажет спасибо, благо что мой батник писался действительно под себя и левой ногой - кое чего людям не хватает.
а критиковать использованные связки команд ради абстрактной правильности в отрыве от контекста, ничего не предлагая взамен - много ума не надо...
Автор: yurkesha
Дата сообщения: 20.05.2007 12:49
Не принимай близко к сердцу - я не имел в виду ничего обидного.
Прости если обидел!
А насчет errollevel - ошибки должны генериться в одном потоке. Для примера создадим такой (ошибочный заведомо код):

Код: reg query &Раздел\подрадел"
echo %errorlevel%
Автор: wolf0425
Дата сообщения: 20.05.2007 12:52

Цитата:
создадим такой (ошибочный заведомо код):

получаем код ошибки 9009.
надеюсь ты не будешь настаивать на интерпретации, что случилось 9 тысяч ошибок?
Автор: Angel_Ka
Дата сообщения: 20.05.2007 13:04
wolf0425

Цитата:
да просто я автор вполне конкретного батника, по которому Angel_Ka вопросы задавал...

А я то всё думала не случайно ли совпадение ников? Кстати, писали Вы тот архиполезный батник по просьбе моего очень хорошего знакомого. Только Вы ему об этом не сообщайте, плз... Он вообще-то большой энтузиаст Far и если бы не он, то кто знает... А Ваш батник он называет не иначе как чудесным. Кстати, он придумал переименовать Far.exe в pFar.exe и тогда "переносная" и "столовая" (так он их обзывает) версии Far не пересекаются. Думаю, что он не обидится, что я выдала его секрет.
Автор: KWladimir
Дата сообщения: 20.05.2007 13:23
2 renreg:
PStart
http://www.pegtop.net/start/
Автор: wolf0425
Дата сообщения: 20.05.2007 13:30
кстати о %errorlevel% и reg.exe
стандартные коды ошибок описаны тут
про то, какие коды будут в случае некорректных операндов - там ничего нет,
а вот коды 0 1 и для некоторых команд 2 - документированы.

ещё на тему errorlevel следует упомянуть, что
связка if errorlevel 1 вовсе не эквивалентно if %errorlevel%==1
а связка || ... примерно соответсвует if errorlevel 1 (...) за исключением строк, вызывающих ошибку у cmd.exe
Автор: Angel_Ka
Дата сообщения: 20.05.2007 13:49
wolf0425

Цитата:
кстати о %errorlevel% и reg.exe
стандартные коды ошибок описаны тут

Вот я получила ответ на вопрос, который задавала:

Цитата:
А не подскажете, где можно было бы прочесть про возвращаемые коды reg query по максимуму?
Не ли ссылки?
Гуд, очень гуд!
Однако очень хорошо, что этот ответ получен после дискуссии! Не зря говорят, что нет худа без добра...
Автор: wolf0425
Дата сообщения: 20.05.2007 14:14

Цитата:
я то всё думала не случайно ли совпадение ников

0425 - это месяц и день, когда Maza Faka нашел для себя фаровский форум,
попутно отрекламировав там этот

Цитата:
Только Вы ему об этом не сообщайте, плз

надеешься, что этот форум сам он не читает?
Автор: igor_andreev
Дата сообщения: 20.05.2007 14:19
Еще чуток про errorlevel и заодно про разницу между .BAT и .CMD, хотя официально ее вроде как и нет.
Запустить код как .bat, а потом как .cmd. Из ньюсов откуда-то когда-то скопипастил, вроде из microsoft.public.win2000.cmdprompt.admin, автор кажется тот же вумный дядька Herbert Kleebauer

Цитата:

There is a difference between .bat and .cmd. Execute the following
code as a .bat and as a .cmd program:

Код:
@echo off

set a=
call :seterr
echo errorlevel: %errorlevel%
set a=
echo errorlevel: %errorlevel%

set a=
call :seterr
echo errorlevel: %errorlevel%
set a=irgendwas
echo errorlevel: %errorlevel%

set a=igendwas
call :seterr
echo errorlevel: %errorlevel%
set a=
echo errorlevel: %errorlevel%

goto :eof

:seterr
exit /b 10
Автор: Angel_Ka
Дата сообщения: 20.05.2007 14:21
wolf0425

Цитата:
0425 - это месяц и день, когда Maza Faka нашел для себя фаровский форум,
попутно отрекламировав там этот

А там у него такой же неприглядный ник?

Цитата:
надеешься, что этот форум сам он не читает?

КУ-КУ!!!

Сэнкс. Перечла записи. Вроде бы всё пристойно. Какая я молодец...


Добавлено:
igor_andreev

Цитата:
Еще чуток про errorlevel и заодно про разницу между .BAT и .CMD ...

Можно то же по русски? И помедленнее... я записываю!
Автор: wolf0425
Дата сообщения: 20.05.2007 14:41
igor_andreev спасибо, классный примерчик.
Автор: Nagual
Дата сообщения: 20.05.2007 14:55
у меня код
@echo off
reg query &Раздел\подрадел"
echo %errorlevel%
pause
выдает
Ошибка: Слишком мало параметров в командной строке.
Системе не удается найти указанный путь.
3
код, приведенный igor_andreevым выдает
errorlevel: 10
errorlevel: 0
errorlevel: 10
errorlevel: 0
errorlevel: 10
errorlevel: 0
непонятно зачем там
goto :eof
для отладки кода не годится совсем, поэтому перед ним поставил pause
тема интересная, есть ли универсальный пример по отлову всех возможных ошибок любой команды?
Автор: Angel_Ka
Дата сообщения: 20.05.2007 14:57
wolf0425

Цитата:
igor_andreev спасибо, классный примерчик.


А я не поняла, что это значит:


Код: B:\>igor.bat
errorlevel: 10
errorlevel: 1
errorlevel: 10
errorlevel: 10
errorlevel: 10
errorlevel: 10

B:\>igor.cmd
errorlevel: 10
errorlevel: 1
errorlevel: 10
errorlevel: 0
errorlevel: 10
errorlevel: 0
Автор: Elroir
Дата сообщения: 20.05.2007 15:00
Nagual

Цитата:
непонятно зачем там goto :eof
для отладки кода не годится совсем, поэтому перед ним поставил pause

Для отладки надо запускать скрипт в консольном окне, а не из эксплорера.

Цитата:
есть ли универсальный пример по отлову всех возможных ошибок любой команды?

Нет.
Автор: wolf0425
Дата сообщения: 20.05.2007 15:13
Angel_Ka

Цитата:
А я не поняла, что это значит:

это хорошо иллюстрирует
Цитата:
With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL only on errors.

10 - это специально устанавливаемый код,
после чего идет set в трех вариантах: переменная не определена, изменяется и уничтожается ранее определенная.
в cmd - errorlevel всегда соответствует последней исполненной команде set: 1 если такой переменной ранее не было, 0 в остальных случаях.
в bat - комынды set с предустановленной ранее переменной не вызывают изменения текущего errorlevel, т.е. т.е. для него успешных команд set как будто и не было и errorlevel от идущей до set команды сохраняется неизменным, изменяется он только теми set, которые имеют ненулевой errorlevel (например вводят новую переменную)...

Автор: Elroir
Дата сообщения: 20.05.2007 15:16
Angel_Ka

Цитата:
Хоть кто ни-будь, хоть намекните, что это значит? Ведь все команды одни и те же! А почему результаты разные? Это глюки?

Это демонстрация разницы между .cmd и .bat файлами.
Перевод последней цитаты igor_andreev-а:
Если разрешены расширения (команд), команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD будут устанавливать код ошибки (errorlevel) независимо от того, произошла какая-либо ошибка при работе или нет. В .BAT код ошибки будет устанавливаться только в том случае, когда в процессе работы произошла ошибка.
Автор: Angel_Ka
Дата сообщения: 20.05.2007 15:18
wolf0425


Цитата:
в cmd - errorlevel всегда соответствует последней исполненной команде: 1 если переменной ранее не было, 0 в остальных случаях.
в bat - комынды set с предустановленной ранее переменной не вызывают изменения текущего errorlevel - т.е. для него успешных команд set как будто и нет...

Другими словами .cmd консоль обрабатывает вернее чем .bat ...

Сэнкс!

Elroir


Цитата:
Перевод последней цитаты igor_andreev-а:
Если разрешены расширения (команд), команды PATH/APPEND/PROMPT/SET/ASSOC в .CMD будут устанавливать код ошибки (errorlevel) независимо от того, произошла какая-либо ошибка при работе или нет. В .BAT код ошибки будет устанавливаться только в том случае, когда в процессе работы произошла ошибка.

А вот это опять не ясно. Звучит противоположно тому как я поняла. Но ведь на деле результаты из .cmd правильнее, чем из .bat?

Так... Молчание - золото. Типа: "отвяжись, дура, а то уже пятый час". Ну что ж. По домам.
Автор: Nagual
Дата сообщения: 20.05.2007 15:25
Elroir

Цитата:
Для отладки надо запускать скрипт в консольном окне
, угу, как то даже не догадывался раньше

Цитата:
Нет.

обидно
Автор: Elroir
Дата сообщения: 20.05.2007 15:33
Nagual

Цитата:
обидно

Чаще всего разработчик программы указывает в документации, какие коды ошибок возвращает программа в разных ситуациях.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Автозагрузка терминальной сессии


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.