Страница 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
У меня не работает

Код: Выделить всё

SetEnv /A /EV PATH ;%COMMANDER_PATH%
Проверьте ещё кто нибудь
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 в предыдущем посте. Без этого ругалась на отсутствие файлов, а с этим - на неправильное их содержание - значит, нашла. :D

Код: Выделить всё

[Load]
Command=1.vbs
Wait=1

[Unload]
Command=2.vbs

Добавлено: Ср сен 21, 2011 00:17
Flasher
MVV
Спасибо, теперь работает. :)

Теперь буду думать как с перезапуском решить...
Вот, придумал: если перезапуск вызывается из другого скрипта или утилиты, то не выполнять Command. Сможешь прикрутить такую фичу?