NvvLazyTiger
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору 2life Цитата: - Хочется знать, как проверить отключение диска с помощъю (%ErrorLevel%)? Или лучше сделать это с помощью проверки папки? Как видно диск подключается к последней папке с файлами архивов, хотя можно наверное создать пустой каталог, и по нему проверять... Но формат команды, мне неизвестен, не той не другой(%ErrorLevel%) | 0. Я педант, поэтому обычно пишу много... ;) 1. Как "лучше сделать это", - зависит от множества разных обстоятельств. Начиная со среды исполнения + условий использования того или иного технического решения, и, заканчивая квалификацией разработчика/эксплуатационного персонала. А ещё есть вкусовые предпочтения, т.к. одно и тоже обычно можно сделать по-разному... Например: *.CMD, пускаемый однократно (автором, "на коленке"), и аналогичный (делающий тоже самое), но работающий на сервере в автоматическом необслуживаемом режиме, - это "две большие разницы". Так что ниже идут некоторые практические соображения, касаемо именно серверных решений, работающих годами в разных местах под w2k & w2k3. 2. Общие соображения (касаемо *.CMD): А) Т.к. "разбор полётов" (при авариях) обычно выполняется в цейтноте и post factum, то совершенно обязательно максимально подробное протоколирование (занесение в лог) всего, что доступно в процессе. Бо далеко не всегда возможно повторение "на бис". В большинстве случаев достаточно перенаправлять в лог выдачу команд (StdOut & StdErr), например: Код: net use %myRemoteShare% /delete >> %MyLog% 2>>&1 | Б) Многократно используемый контекст удобно задавать в переменных среды (например %myRemoteShare%). В результате полностью исключается ситуация "кто в лес, кто по дрова" при изменении/использовании этого контекста. В) Желательно (по возможности;) проверять наличие необходимых условий (ДО запуска команды) и получение нужного результата (ПОСЛЕ). Например, для команды Erase: "до" - существование того, что нужно удалить; "после" – отсутствие оного. Г) Критические (т.е. те, что могут завершиться аварийно или "бесследно умереть", утащив за собой весь *.CMD) команды у меня обычно оформляются так [пример]: Код: Set RetErrTxt=net use %myRemoteShare% /delete Echo ? %RetErrTxt% >> %MyLog% %RetErrTxt% >> %MyLog% 2>>&1 || goto ErrsRecoverSub | Т.е. - в логе фиксируется строка запуска критической команды (ДО того КАК); - туда же идёт выдача этой команды; - п/п обработки аварийных завершений (ErrsRecoverSub) получает через %RetErrTxt% строку запуска, закончившуюся ненулевым ErrorLevel. Для организации оповещения и прочих действий в связи. Д) Запуск самих *.CMD также протоколируется (отдельно) + отслеживается их код возврата [см. Б) т.е. единый подход для всех уровней вызова]. Е) ErrorLevel – это не формат и не команда, а глобальный атрибут, т.н. "код возврата" [команды]. Условие "нулевой код возврата [завершения]" [команды] – это признак [её] успешности. В большинстве случаев, но не всегда... Например, у исключительно удобной и функциональной утилиты RoboCopy.Exe коды 0..7 – успешные (зависят от обстоятельств), а коды 8..15 – нет. Зато интерпретатор cScript.Exe возвращает нулевой код и при аварии в скрипте (если там явно не установлен иной код завершения). BTW У меня такие "неоднозначные" команды "упакованы" в отдельные утилиты (*.CMD) с унифицированным интерфейсом. Там же организованы и всё потребные "пляски с бубном" вокруг параметров вызова, проверок условий и анализа результатов. С другой стороны, коды возврата – это удобное средство для организации расширенного взаимодействия между вызванным (child) и вызвавшим (parent) процессами. Например, см. справки по командам/операторам: exit /?, set /?, if /?, etc. Ё) Отдельный, очень важный момент – должна быть обустроена надлежащая система оперативного оповещения ("тех, кого следует";) с фиксацией [аварий]. Флаги, почта, net send и т.п... 3. Частные соображения (касаемо NET [USE]): А) Достаточно "неоднозначная", даже коварная команда. Требует очень внимательного кодирования "вокруг" при использовании. Поведение сильно зависит от среды и условий исполнения. Реакция может быть весьма неприятна, например, при вызове в *.CMD без консольного доступа, выход на консольное приглашение: Код: – т.е. процесс повисает до прямого снятия административными средствами. Б) Я не вижу смысла использовать планирование на буквы устройств (например, на Z:), если это не требуется для какой-то особой ситуации. Бо большинство известных мне команд (и даже серьёзных приложений) прекрасно работает (если доступ уже обеспечен) по полным путям типа \\Server\Share\Dir\File. А буквы, - это ограниченный ресурс... ;) В) Я также не вижу смысла в явном удалении сетевых подключений, если оные никому не мешают (одной критической командой меньше). Тогда (при надобности) просто выясняем видимость нужного, а уж затем (если НЕ видно) – подключаемся. Т.е. подход - "разумнее избегать сложностей, чем бороться с оными". Г) Проверки... "Их есть у меня!" ;)- подключение к ресурсу
Код: Set MyShare=\\Server\Share net use|find /i "%MyShare%" && goto MyShareOk действия при отсутствии подключения goto GoOn : MyShareOk действия при наличии подключения | Т.е. запрос имеющихся подключений и поиск нужного - наличие файла
Код: Set MyShare=\\Server\Share Set MyFile=MyDir\SomeFile If exist %MyShare%\%MyFile% goto MyFileOk действия при отсутствии файла goto GoOn : MyFileOk действия при наличии файла | Т.е. проверяется именно видимость (но НЕ доступность!) конкретного файла - наличие подкаталога
Код: Set MyShare=\\Server\Share Set MyDir=SomeDir\ If exist %MyShare%\%MyDir% goto MyDirOk действия, если подкаталог не обнаружен goto GoOn : MyDirOk действия, если подкаталог в наличии | Причём: NB.- Бессмысленно проверять видимость шары (условием exist). Т.е. нужна видимость чего-то именно внутри оной.
- Если не указывать конечный обратный слеш (‘\), возможно ошибочное срабатывание при отсутствии подкаталога SomeDir , но наличии одноимённого файла.
- Вместо явной проверки существования (‘exist) можно использовать команду ‘dir с анализом кода возврата (или выдачи оной команды - отдельные ‘песни;). К слову, эта команда может применяться и к шарам.
- успешность команды net use, неявно – любым способом из вышеперечисленного, или явно – по коду возврата или анализу выдачи (анализ не совсем тривиален, но в некоторых случаях востребован).
Мне описанного хватает. Явных предпочтений нет. Вот, где-то так. (Я сказал, что зануда?;))) |