PDA

Показать полную графическую версию : Некорректность выполнения батника в случ.не успешн выполн. команды


daledale
09-11-2022, 01:39
Доброго. Такой вопрос. Есть батник:
net use x: \\comp1\share || shutdown -s -t 0
...
Ну всё просто, доступен сетевой ресурс - подключаем сетевой диск - выполняем дальше. Не доступен - выключаем пк.
Исходные данные - сетевой ресурс НЕ доступен 100%. Пользователь - права администратора 100%. Программа (см.ниже) запущена с правами этого же пользователя = с правами администратора. Система Win2003 (а-ля XP).
В общем вручную запускаю батник - "ошибка, отдаётся команда на выключение". Т.е. всё ОК.
Есть программа резервного копирования (напомню, она запущена с правами этого же пользователя с правами администратора). У этой программы в настройках прописан этот батник после выполнения резервирования. Она (эта программа) успешно запускает этот батник, видно, что ждёт 2-3 сек. подключения сетевого ресурса (как и при ручном запуске батника), видно на мгновение, что выскакивает ошибка, помоему о недоступности сетевого ресурса (точнее сказать не могу, проскакивает быстро) и.... всё, пк не выключается, т.е. даже не доходит до выполнения команды shutdown -s -t 0
Вопрос не в изменении батника (изменить могу) и возможно вопрос не совсем в эту ветку по батникам... Мне интересно какие есть подводные камни в такой конф. батника с "||". Почему такое неоднозначное поведение может быть?
Спасибо.

Serguei Kouzmine
09-11-2022, 03:29
чтобы без опасений уверенно использовать || переходите на линукс. под виндоз ненадежно

всякие if ERRORLEVEL 1 goto : там от этого

https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc754335(v=ws.11)

Elven
09-11-2022, 08:39
&& - выполнить, если предыдущая команда вернула "0", || - выполнить если предыдущая команда вернула НЕ "0". вроде как все просто, с этим можно жить, но иногда всплывают неприятные подводные камни, с которыми непонятно куда приткнуться. и непонятно в первую очередь потому, что нет стройного понимания, что выполнилось, а что нет. посему таковая конструкция используется в ванлайнерах или в том месте, где ответ предыдущей команды совершенно однозначен и не подразумевается возможности невыполнения команды следующей.
для всех прочих случаев лучше придумать какую-то другую проверку, например в случае с сетевым диском я использовал if (not) exist c обязательным else. Так банально проще увидеть в каком месте батник спотыкается (хотя бы через echo "шара (не)доступна" >> error.log).

конкретно с поведением || в указанной проблеме в первую голову приходит вопрос о пользователе, это именно отдельный пользователь или какая-то встроенная учетка от имени которой выполняется батник?

daledale
09-11-2022, 11:49
Elven
Спасибо за ответ.
конкретно с поведением || в указанной проблеме в первую голову приходит вопрос о пользователе, это именно отдельный пользователь или какая-то встроенная учетка от имени которой выполняется батник? »
Это текущий пользователь = администратор, в котором вот открыт текущий активный сеанс Windows. Программа работает тоже от имени текущего пользователя.
Если батник запускает человек вручную - всё ок, батник отрабатывается как надо.
Если батник запускает программа - не работает. (Опять же, возвращаясь к написанному - выполняется первая команда, ищется сетевой ресурс и не находится - всё, выполнение батника останавливается).

daledale
09-11-2022, 12:09
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 Однако интересный казус))

dmitryst
09-11-2022, 19:20
Win не может найти экзешник »
либо копируйте нужный файл в папку к батнику, либо прописывайте полный путь ;). Та же проблема и на линуксах, кстати, если запускать батник из планировщика. Но там ситуация с "||" и с обработкой ошибок вообще, получше будет. Лично я все операции по копированию кидаю в планировщик, при ошибках подключения к шаре я получаю сообщение об этом, и особых проверок можно не делать.

DJ Mogarych
09-11-2022, 21:57
В Windows полный порядок с обработкой ошибок, но если не пользоваться технологиями прошлого века (при всём к ним уважении), а перейти на Powershell.




© OSzone.net 2001-2012