Страница 23 из 243
Добавлено: Ср сен 14, 2011 10:10
MVV
LonerD писал(а):Не знаю. Но при перезапуске - что утилитами, что скриптом, - переменные остаются. Получается, что-то не даёт им полностью выгрузиться/удалиться.
Переменные окружения не умеют
выгружаться/удаляться сами по себе. При запуске программы ей
по наследству переходят все переменные окружения, которые были в запускающей программе. Поэтому при запуске рестартера из тотала он наследует среду тотала, а тотал, запущенный рестартером - его среду, которая унаследована от прежнего тотала.
Код: Выделить всё
Открыть Autorun.cfg и удалить добавленную строку.
Теперь перезагрузить Тотал (через утилитку или скриптом).
Опять зайти в Environment Variables.
OSArch всё-ещё там, хотя в авторане она отсутствует (переменная осталась от предыдущего запуска Тотала и не удалилась при перезапуске).
Естественно. Некому было удалять её оттуда.
Код: Выделить всё
А теперь закрыть Тотал полностью и открыть его снова. Переменной уже нету.
Ты же запускаешь новую копию тотала из Проводника (меню Пуск, панель задач и рабочий стол тоже принадлежат ему). В котором эту переменную никто не определял. Потому и нету. А если бы кто-то определил такую переменную глобально, она была бы у всех.
Добавлено: Сб сен 17, 2011 21:01
LonerD
MVV писал(а):LonerD писал(а):Переменные окружения не умеют выгружаться/удаляться сами по себе. При запуске программы ей по наследству переходят все переменные окружения, которые были в запускающей программе.
Это собственно я и имел в виду когда спрашивал:
LonerD писал(а):Или же этого невозможно добиться в силу того, что рестартер как таковой запускается из-под Тотала?
Мелкая неприятность, которую заметил при экспериментах с переменными окружения. Буду иметь в виду, хотя вряд ли это когда-нибудь понадобится.
А вот такой нюанс очень даже портит жизнь:
При закрытии Тотала отрабатывает Autorun_Starter.bat и через него убиваются запущенные приложения. Например, в autorun.cfg у меня прописан запуск AUTOFx.exe при запуске Тотала. А в Autorun_Starter.bat прописано:
Код: Выделить всё
:starter_unload
taskkill /t /IM AUTOFx.exe
taskkill /f /IM AUTOFx.exe
echo Unloading
goto :EOF
То есть при закрытии Тотала AUTOFx убивается.
Всё отлично до тех пор, пока не запустить вторую копию Тотала (или например сравнение файлов-папок в другом процессе). После закрыти второй копии Тотала - AUTOFx тоже убивается.
Как этого избежать?
Нужно как-то сделать проверку, что не запущена вторая копия Тотала и только после этого выгружать программу или сделать проверку что программа запускалась именно из-под этой копии Тотала... или ещё каким-то образом...
Добавлено: Сб сен 17, 2011 21:09
ApceH
LonerD
Если речь идёт о разных ТС/сборках, то опять же, нужно убивать либо по пути, как мы обсуждали
тут.
Или же составить up-файл (пресет) и в Авторане выполнить этот пресет. А в пресете прописать убийство процессов с нужным путём.
А если один и тот же ТС, то нужно учитывать родственные связи. Мне такие средства неизвестны.
Добавлено: Сб сен 17, 2011 21:22
Flasher
ApceH писал(а):А если один и тот же ТС, то нужно учитывать родственные связи. Мне такие средства неизвестны.
Так там убийство по PID. Никаких проблем с tskill без /A.
Добавлено: Сб сен 17, 2011 21:46
MVV
Можно легко научить батник не запускать и не убивать программы, если запущено более одной копии тотала...
Добавлено: Сб сен 17, 2011 22:04
LonerD
Если речь идёт о разных ТС/сборках, то опять же, нужно убивать либо по пути
Не о разных сборках, а об одной и той же - просто открыть ещё одну копию своего Тотала или же выполнить сравнение-синхронизацию в отдельном процессе.
Можно легко научить батник не запускать и не убивать программы, если запущено более одной копии тотала...
Да, это один из вариантов, наверное, самых легко реализуемых. Как проверить что запущены несколько копий TOTALCMD.EXE?
Добавлено: Пн сен 19, 2011 15:11
MVV
Один из вариантов:
Код: Выделить всё
@echo off
set /A tc_count=0
for /F "usebackq delims=" %%l in (`tasklist /fi "IMAGENAME eq TOTALCMD*"`) do (
echo %%l | find /i "totalcmd"
if not errorlevel 1 call :inc
)
if /i %tc_count% lss 2 goto exec
goto :EOF
:inc
set /A tc_count=%tc_count%+1
goto :EOF
:exec
echo Only one or none TC instances found.
Ищет сразу и 32-битные, и 64-битные копии (к слову, все процессы, имена которых начинаются с
TOTALCMD). При этом, если запускается тотал #1, потом #2, потом закрывается #1 и потом закрывается #2, запускать всё будет батник от #1, а убивать процессы - батник от #2.

Добавлено: Вт сен 20, 2011 17:07
HA3APET
У меня не работает
Проверьте ещё кто нибудь
1.4.9.6 beta
Добавлено: Вт сен 20, 2011 17:20
LonerD
MVV. Спасибо.
А как поведёт себя код если запустить #1, потом #2, закрыть вначале #2, а затем #1 ?
HA3APET
Уже с месяц использую это строку - работает.
Проверил приведённый тобою код (решил, что может символы неправильные) - тоже работает.
Добавлено: Вт сен 20, 2011 18:26
MVV
LonerD писал(а):А как поведёт себя код если запустить #1, потом #2, закрыть вначале #2, а затем #1 ?
Батник всегда будет выполнять действия, если запущено не более одной копии тотала. Так что при правильном вызове батник последнего запущенного тотала будет убивать процессы.
Добавлено: Вт сен 20, 2011 22:18
Flasher
MVV
Можешь сделать что-нибудь с
плагином, чтобы vbs прикрутить?
Добавлено: Вт сен 20, 2011 23:22
MVV
Могу. Переписать с нуля.
Код: Выделить всё
MIME-Version: 1.0
Content-Type: application/octet-stream; name="Autorun_Execute.7z"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Autorun_Execute.7z"
N3q8ryccAAOY8dQX2wQAAAAAAABxAAAAAAAAAGWYVR4AJpaOcAAX9+wFu+r0/5QBL0TuTr0JScWp
wXIs+2C8FAvofZL9OQyrmdRJ6fFEUwUox4AepJrWfamkx9MSo1AMPur1FMg8of0jfCyT3T8/4QjX
pnYCgF2sz0O89Ephh0uLtfvvc/FD0ezOcJchTpj6oNVFTYW8DDhln73GEQH3KuVPc4rlFYJRQnGb
rU4sUUHicRm/o/6+eh1mnG/DnibKhxYhWEnp49Ihn+am5mX55EbeI2P1yfZ7To1H8sMf26GgZUsm
b21zbkCwNQJktcWwhrCg36U9lWdkFU/xGU8nBITFjlKZcIBdOq8dBR+TeEmX+fCl1vuFYE7zoPVa
tpO5jvzujKNzXD+ZnnHfHGOLEEgdfGMvyEsuW1kGrpJ3oxLQuO9ggrx9P24BtWrKSX/NEJWuJs2B
8nF97a219oTSX7RnzX0LE+AMzDp41VzxWAaim1V8r2TsebU6AdDrZQ8JOiB3JKDFcwv7R+d8a/Qe
InLULQ7ZNuoo4B8IMIhus3JNIG0jSEbvACMNXifA8YPWmVakMZYZdWdYsgD85QITMBCUAfDJR1hM
ImDRdy+0tSMV1dGa9JH206hRd1x4ilHW4NgzGK/e7lPFhq4nvACgc9LDpF8yYNphnH4TQO308p/7
lY9qoU74gUrpTEOIC8gHtq/UyQxwQlSki/eMjmJlUcMXuNjjbfPDBkT2PXB6K5GlxxzX69RelK/a
EIRVQBFVq7+qgv7zTcf6Q2SBqzWZJxC0Sd73Ch01TQoEXBtI5HblMo+B4NJVRWOR0Nv2kIUCo+Iw
TTfKM2FAk7978naOoefxyczFjUbX5J7AWk4HGNWk8gJ0zqq2Eb4g0RzXwTfnX30Yp/CHjjwG1Amk
CrYgpwML363t8IKKG0EdMHd8fhq6xOGpMkgGjk+/f1JMlPAFCmLW0ex75nlB8mOZ/z7TBLAbFxDo
sLzD6kXjT7Qu7s2GKRVYW4AYKI0RHiQGqNbFcaPUKIPgEllh8g2bjRKMqQIrJSIDAP0AVoSPntPE
eXyRoX2rTUxcNOC4eLlIdqK38yC3d3KvNPzj6tqvYxltjdJHDMg4tlCHrY6rMy7GK8j/2MHe0Kon
t37J5CTmu3/sztTLNmsgQYuHMeut8nFO7MMLWJMfTWHQo6l7tbcZ9Zm1x2aDQTlel5yY2vPBA1/d
2INpITYq7k3T72IZ9L6ciqznz4ul83lsIyvcP1qVdCsoqLgBSrQXrSk3du9sY6l93PnDDXWCP3yp
vA3JEk4Y/ALtAlbiRgIyigfETK/gGXs5EhCaHeNYOqDX7eRXqIIBGK737iQEeTxpmbLoj2YYS8J7
jy/9RLDpiL1FmDffc4q+RFvcsbYnpszb/PXF9G5g3qRLxVLKB6A0RO4NlPRPimknFBzzgG5pMweT
nwunHG4JjyEWBxbA1q8c/TLMHqFV1pSOzr3KyYSXRnVWOHFrMMxOqPOvLgkmXa8ildGgdO1/Azao
3ewtfLsQlmprwFV62RU/a5MZXQlkouvdZMTQFTqXGmC/2yI0y/6Zxx+zZQKmQiLbA8QXzS2u6PRL
Yvsqm9Yj5hnjk5tP0NvPz9VKsmcpWjY63AoMBUMzv5TT5KTWEL79m5mSyC+/kjQxpcZQrsH1o28F
aYSnMFb5XethoFuhjwe8ndcyHiAAAQQGAAEJhNsABwsBAAIjAwEBBV0AAAEABAMDAQMBAAyMAIwA
AAgKAQTtSO0AAAUBESkAQQB1AHQAbwByAHUAbgBfAEUAeABlAGMAdQB0AGUALgBkAGwAbAAAABQK
AQBmvF5o0HfMARUGAQAgCAAAAAA=
Рядом с библиотечкой положи INI-файл с таким же именем, в нём пропиши что-то вроде:
Код: Выделить всё
[Load]
Show=5
Command=Load.vbs
[Unload]
Command=Unload.vbs
Wait=0
Вообще, в строке
Command можно указать любую командную строку, например, запустить батник, экзешник или документ. Параметр
Show принимает обычные значения
SW_* (см. справку по
ShellExecute), по умолчанию 5 (
SW_SHOW). Параметр
Wait позволяет указать, надо ли дожидаться завершения программы, и по умолчанию равен 1.
Добавлено: Вт сен 20, 2011 23:51
Flasher
MVV
Спасибо. А секция Load в ini обязательна? Я оставил только Unload. Кинул Unload.vbs рядом. При закрытии пишет "Не удается найти "Unload.vbs"."
Добавлено: Ср сен 21, 2011 00:05
MVV
Если секции или параметра
Command в ней нет, модуль молча пропустит выполнение.
А ошибка, скорее всего, из-за того, что текущая папка при выходе стала другой. Добавил установку папки с модулем в качестве рабочего пути при вызове
ShellExecuteEx, обновил MIME в предыдущем посте. Без этого ругалась на отсутствие файлов, а с этим - на неправильное их содержание - значит, нашла.
Код: Выделить всё
[Load]
Command=1.vbs
Wait=1
[Unload]
Command=2.vbs
Добавлено: Ср сен 21, 2011 00:17
Flasher
MVV
Спасибо, теперь работает.
Теперь буду думать как с перезапуском решить...
Вот, придумал: если перезапуск вызывается из другого скрипта или утилиты, то не выполнять Command. Сможешь прикрутить такую фичу?