Показать полную графическую версию : Странное поведение bat при logoff
pedrosoft
01-07-2020, 23:15
Привет!
Помоги разобраться со странный поведением системы. У меня есть 2 bat-файла.
Первый создает lock.txt каждые 60 секунд
:loop
echo %computername% %date% %time% > lock.txt
timeout /t 60
goto loop
Второй - запускает программу и после ее завершения удаляет lock.txt и выходит из системы
start /wait QikDesktop.exe
del /f /q lock.txt
logoff
А странность заключается в том, что когда проходить команда logoff, первый bat-ник создает файл вопреки своему таймеру. Без команды выхода из системы, файл удаляется. Это как то можно победить?
Для меня стало новостью что в виндах есть команда logoff, в виртуалку лезть лень, посему проверять не буду. Для аналогичного действия всегда использовал shutdown -l.
Однако к батникам. Первый батник использует goto, что вообще не очень красиво и чего следует избегать (не только в батниках, скорее вообще по жизни). Вместо того чтобы создавать бесконечный цикл с таймаутом в хлипком батнике, лучше бы загнать в шедулер одну строчку и отправить ее выполняться каждую минуту. Какой гешефт это будет иметь? Не будет привязки к времени отработки и прорисовки ответов от всех команд, т.о. через шедулер файл на самом деле будет создаваться раз в минуту, а не раз в 60,035 секунд (тысячные приведены для примера, не являются реальным замером). На набольшом промежутке времени это не так уж критично, но если взять хотя бы несколько часов... Ну и вопреки таймеру происходить ничего не будет.
Строчка эта, как я вижу, не только создает, еще и перезаписывает имеющуюся в этом файле информацию, но это как бы не особо критично.
Во втором батнике не вижу ничего криминального, файл удаляется потому что команда на логоф после удаления.
Foreigner
02-07-2020, 12:34
Для меня стало новостью что в виндах есть команда logoff »
> logoff
'logoff' is not recognized as an internal or external command,
operable program or batch file.
Не уверен, но вроде в более ранних версиях виндоус logoff вроде был.
pedrosoft
02-07-2020, 15:47
Для меня стало новостью что в виндах есть команда logoff, в виртуалку лезть лень, посему проверять не буду. Для аналогичного действия всегда использовал shutdown -l.
Однако к батникам. Первый батник использует goto, что вообще не очень красиво и чего следует избегать (не только в батниках, скорее вообще по жизни). Вместо того чтобы создавать бесконечный цикл с таймаутом в хлипком батнике, лучше бы загнать в шедулер одну строчку и отправить ее выполняться каждую минуту. Какой гешефт это будет иметь? Не будет привязки к времени отработки и прорисовки ответов от всех команд, т.о. через шедулер файл на самом деле будет создаваться раз в минуту, а не раз в 60,035 секунд (тысячные приведены для примера, не являются реальным замером). На набольшом промежутке времени это не так уж критично, но если взять хотя бы несколько часов... Ну и вопреки таймеру происходить ничего не будет.
Строчка эта, как я вижу, не только создает, еще и перезаписывает имеющуюся в этом файле информацию, но это как бы не особо критично.
Во втором батнике не вижу ничего криминального, файл удаляется потому что команда на логоф после удаления.
В моем случае через шедулер сделать не получиться, потому что сейчас эти батники запускаются хаотично на десятках ПК с таким же заотичным расписанием работы.
Файл lock и должен удаляться. Попробую заменить logoff, но не думаю, что проблема в этом.
создает файл вопреки своему таймеру »
да ладно, давайте разберем:
просто пропускаем
:loop
создаем файл с информацией в echo
echo %computername% %date% %time% > lock.txt
ждем 60сек
timeout /t 60
переходим по метке
goto loop
так почему вопреки, через каждые 60сек файл перезаписывается, но создается при запуске bat
в виндах есть команда logoff »
161874
Это как то можно победить? »
а что надо-то?
сейчас эти батники запускаются хаотично на десятках ПК с таким же заотичным расписанием работы »
тогда думаю надо сначала навести порядок, потому что вы быстрее голову поломаете с такими запусками чем с коверканием батников, тем более что я тоже поддерживаю лучше бы загнать в шедулер одну строчку и отправить ее выполняться каждую минуту »
если не знаете как это сделать, то вот, например, задание "Proba" на запуск "C:\name.bat" каждую минуту:
SCHTASKS /Create /SC MINUTE /MO 1 /TN "Proba" /TR "C:\name.bat"
pedrosoft
05-07-2020, 23:22
alpap спасибо, шедулер я сейчас загнать ну никак не могу.
Подскажите пожалуйста как через цикл for создавать файл каждую минуту? Пробовал таким способом, но работает не корректно - первый раз создает и дальше информация в файле не обновляется.
for /l %%a in (0,0,0) do (
echo %computername% %date% %time% > lock.txt
ping -n 30 127.0.0.1
)
pedrosoft, обновляется (Вы это можете увидеть по дате-времени создания файла. Просто она у Вас всё время одна и та же — та, что будет на время входа в операторные скобки цикла.
Либо:
@echo off
setlocal enableextensions enabledelayedexpansion
for /l %%a in (0,0,0) do (
>"lock.txt" echo !computername! !date! !time!
ping -n 30 127.0.0.1
)
endlocal
exit /b 0
Либо:
for /l %%a in (0,0,0) do (
>"lock.txt" call echo %%computername%% %%date%% %%time%%
ping -n 30 127.0.0.1
)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.