![]() |
Некорректность выполнения батника в случ.не успешн выполн. команды
Доброго. Такой вопрос. Есть батник:
net use x: \\comp1\share || shutdown -s -t 0 ... Ну всё просто, доступен сетевой ресурс - подключаем сетевой диск - выполняем дальше. Не доступен - выключаем пк. Исходные данные - сетевой ресурс НЕ доступен 100%. Пользователь - права администратора 100%. Программа (см.ниже) запущена с правами этого же пользователя = с правами администратора. Система Win2003 (а-ля XP). В общем вручную запускаю батник - "ошибка, отдаётся команда на выключение". Т.е. всё ОК. Есть программа резервного копирования (напомню, она запущена с правами этого же пользователя с правами администратора). У этой программы в настройках прописан этот батник после выполнения резервирования. Она (эта программа) успешно запускает этот батник, видно, что ждёт 2-3 сек. подключения сетевого ресурса (как и при ручном запуске батника), видно на мгновение, что выскакивает ошибка, помоему о недоступности сетевого ресурса (точнее сказать не могу, проскакивает быстро) и.... всё, пк не выключается, т.е. даже не доходит до выполнения команды shutdown -s -t 0 Вопрос не в изменении батника (изменить могу) и возможно вопрос не совсем в эту ветку по батникам... Мне интересно какие есть подводные камни в такой конф. батника с "||". Почему такое неоднозначное поведение может быть? Спасибо. |
чтобы без опасений уверенно использовать
Код:
|| всякие Код:
if ERRORLEVEL 1 goto : https://learn.microsoft.com/en-us/pr...754335(v=ws.11) |
&& - выполнить, если предыдущая команда вернула "0", || - выполнить если предыдущая команда вернула НЕ "0". вроде как все просто, с этим можно жить, но иногда всплывают неприятные подводные камни, с которыми непонятно куда приткнуться. и непонятно в первую очередь потому, что нет стройного понимания, что выполнилось, а что нет. посему таковая конструкция используется в ванлайнерах или в том месте, где ответ предыдущей команды совершенно однозначен и не подразумевается возможности невыполнения команды следующей.
для всех прочих случаев лучше придумать какую-то другую проверку, например в случае с сетевым диском я использовал if (not) exist c обязательным else. Так банально проще увидеть в каком месте батник спотыкается (хотя бы через echo "шара (не)доступна" >> error.log). конкретно с поведением || в указанной проблеме в первую голову приходит вопрос о пользователе, это именно отдельный пользователь или какая-то встроенная учетка от имени которой выполняется батник? |
Elven
Спасибо за ответ. Цитата:
Если батник запускает человек вручную - всё ок, батник отрабатывается как надо. Если батник запускает программа - не работает. (Опять же, возвращаясь к написанному - выполняется первая команда, ищется сетевой ресурс и не находится - всё, выполнение батника останавливается). |
Upd.
Вопрос, снимается. Возможно у меня какой-то частный случай. Но странно всё равно. В общем для тестов изменил батник на: net use x: \\comp1\share || echo share not found&pause --- Сообщение вижу и при ручном и при, так сказать, автоматическом запуске. Меняю echo на shutdown -s -t 100&pause Вручную работает, ч-з программу - нет. Пишет стандартное сообщение, когда Win не может найти экзешник. Но что интересно, файл shutdown.exe - лежит по своему стандартному пути %systemroot%\system32 (c:\windows\system32). В настройках ОС, в переменных окружения PATH этот путь указан. В общем что сделал - скопировал shutdown.exe туда же, где и батник и вуаля, всё работает. ps Прошу прощения, уважаемые гуру, что вас побеспокоил, полностью понимаю, что моя тема абсолютно не связана с батниками и их написанием. pps Однако интересный казус)) |
Цитата:
|
В Windows полный порядок с обработкой ошибок, но если не пользоваться технологиями прошлого века (при всём к ним уважении), а перейти на Powershell.
|
Время: 23:52. |
Время: 23:52.
© OSzone.net 2001-