Войти

Показать полную графическую версию : Модифицированный SFX модуль 7-Zip'а для установок


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 [91] 92 93 94 95 96 97 98 99 100 101

Victor_Man
27-01-2017, 02:39
Еще раз вернулся к скриптам защиты от повторного запуска и сбоев:
http://forum.oszone.net/post-2688624.html#post2688624
Собственно, теперь скрипт формируется и запускается на выполнение прямо в PreExtract (в папке %SfxVarApiPath%):

PreExtract="%%P:hidcon:cmd.exe /c \"(echo set zz_T=%zz_T:\\\\=\\%&echo For /F \"Skip=1 Tokens=1,2 Delims=,\" %%I In ^('Tasklist /FO CSV /FI \"IMAGENAME eq %zz_M%\" /NH '^) Do ^(If %%I==\"%zz_M%\" Set PID=%%~J^)&echo If Defined PID ^(cd /d \"%TEMP\"%^&rd /s /q \"%SfxVarApiPath%\"^&TaskKill /PID %PID% /T /F^)&echo If Exist \"%zz_T%\z3_Stop.cmd\" ^(cd /d \"%zz_T%\"^&call z3_Stop.cmd^))>z1_TaskKill.cmd\"&z1_TaskKill.cmd" Одна дли-и-и-и-нная строчка :) но менять ее не нужно.
=====================================
Какая-то непонятная ситуация возникает :( - пока удалил

Victor_Man
27-01-2017, 19:35
Ж.Д.А.Л.К.Е.Р.,
Только сейчас дошло, что проблема в /FI "IMAGENAME eq XXXX"....я прошлый раз не так понял.
2003 у меня нет, проверить негде.
Через полчасика переделаю, все-равно была еще ошибочка (ее я уже исправил).

CryptoNick
31-01-2017, 19:59
Victor_Man, Так все работает????
Если такая длинная строчка, можно ее и на части разделить, для удобочитаемости...
Создавать, например, батник построчно...

Ж.Д.А.Л.К.Е.Р.
01-02-2017, 10:42
Victor_Man, Tasklist из 2003 сервера тупо не находит процесс если использовать встроенный фильтр, поэтому формируем список всех процессов и дальше его разбираем другими командами.
tasklist x86/x64 из 2003 (http://www14.zippyshare.com/v/mPLKH0pE/file.html), переименовать чтоб имя не совпадало с системным и закинуть в одну из папок %Path%. Так на другой Windows (проверил на Хр х86 и 7 х64) можно воспроизвести проблему 2003-го Tasklist-а.


CryptoNick, Нет, там все по старому.
Создавать, например, батник построчно... »
Вот батник (http://forum.oszone.net/post-2691234-1790.html).

magsood
01-02-2017, 14:03
How last version 7zsd?!

CryptoNick
01-02-2017, 14:32
magsood, Вот (https://www.upload.ee/files/6574861/7zsd_tools_170_3900.7z.html)

Victor_Man
05-02-2017, 20:40
CryptoNick,
Так я так и делал, это в Preextract строчка одна, а .cmd создается многострочный.
V2 вроде рабочий, но.....после длительного тестирования - запускал из .cmd несколько копий - он более чувствительный, иногда, хотя и редко, копии оставались в памяти. Реально такого частого запуска не быть может, конечно, но, тем не менее, как говорится - лучшее враг хорошего. Немного подшаманил V1 (мод. варианта Ж.Д.А.Л.К.Е.Р) - должен работать на W2003:
http://forum.oszone.net/post-2688624.html#post2688624
Все-таки жалко, что Олег не сделал функции выхода из программы...но, что есть, то есть.

Victor_Man
08-02-2017, 13:24
Кстати, столкнулся с еще одной "базовой" проблемой (долго не мог понять, в чем дело):
Windows всегда (наверное?) принимает в пути \\ за \
Для примера, вот так файл Test.txt распечатывается без проблем:

@echo off
set "TEMP=C:\AA BB\"
echo %TEMP%
type "%TEMP%\Test.txt"
type "C:\\AA BB\\Test.txt"
PauseА вот 7zSFX этого не понимает. С проблемой приходится сталкиваться, например, когда назначается:

InstallPath="%TEMP%\PathProgram"
Все прекрасно работает, пока не попадается система, где назначен TEMP с концевым флэшем.
Этот флэш остается в InstallPath и при попытке загрузить программу по RunProgram 7xSFX не находит файл программы!
С одной стороны, вроде в %TEMP% слэша не должно быть, но явно нигде не указано.
И некоторые в процессе настройки системы под себя его ставят. В основном - "старые волки", которые еще DOS помнят.
И вот возникают проблемы с некоторыми программами, они часто неявные, непонятные и не критические, но...7z SFX этому пример.
Неприятно, т.к. мало ли куда может попасть разработанная сборка...всем заранее не укажешь, что %TEMP% без слэша д.б.
Реального универсального выхода из этой проблемы в 7zSFX я не нашел.
Ну, точнее, один есть - все делать через .cmd и cmd /c, но это выход не универсальный.
Может, кто-нибудь все-таки нашел?

Ж.Д.А.Л.К.Е.Р.
08-02-2017, 21:44
Windows всегда (наверное?) принимает в пути \\ за \ »

В справке по модифицированному модулю смотрим раздел "Файл конфигурации":
ВАЖНО! Следующие двухсимвольные последовательности в "значение_параметра" заменяются односимвольными:

\\ = \
\" = "
\n = перевод строки
\t = табуляция
Если надо указать обратный слеш (\) (например, в путях или тексте диалога), НЕОБХОДИМО использовать ДВОЙНОЙ (\\), а если "значение_параметра" или текст диалога содержит кавычки ("), НЕОБХОДИМО перед ними использовать обратный слеш (\") (правило "лидирующего слеша").

Двухсимвольные последовательности \n и \t зависят от регистра. Т.е., \N и \T НЕ будут заменяются односимвольными.

ya158
10-02-2017, 16:16
Ж.Д.А.Л.К.Е.Р., Victor_Man,
Некоторые размышления по-поводу
1. Предотвращения повторного запуска инсталлятора. Создание какого-либа файла типа z1_KillTask.cmd вообще не требуется. Строка типа
ExecuteOnLoad="hidcon:cmd /c FOR /F \"Tokens=1,2\" %I IN ('\"TASKLIST|FINDSTR /BILC:\"%%M\"\"') DO SET /A N+=1&Set PID=%~J&FOR /F \"Tokens=*\" %k IN ('cmd /v:on /C IF !N! GTR 1 ECHO !PID!') DO TASKKILL /F /T /PID \"%k\""
поможет в нелегком деле предотвращения поторного запуска. Также можно добавить выскакиваюшее оклшко с информацией о том, что инсталятор запущен дважды и вторая копия сейчас тасккиллится. У меня такая строка добавляется автоматичеки. Как это делается можно посмотреть здесь (http://forum.oszone.net/thread-295084.html).

2. Хорошая идея проверять и удалять инсталляцию, которая по какой-то причине покрашилась. Но что-то не хочется для этого перезагружаться (я по поводу ключа в RunOnce) - ведь инсталляция может прерваться не только из-за вольной или невольной перезагрузки компьютера. Также лично мне не нравится создание в архиве с программой каких-либо дополнительных файлов (я имею в виду z3_Stop.cmd). Помимо этого в этот файл (z3_Stop.cmd) надо занести всю информацию для полной деинсталляции приложения, хотя инсталляция может быть прервана задолго до конца и полная деинсталляция может оказаться избыточной. Но и не это так важно (влиять должно только на время деинсталляции), как, например, то, что при инсталляции ключи реестра могут не просто добавляться/удаляться, а изменяться. В этом случае заранее не известно какое значение ключа реестра было до инсталляции, и, соответственно, что должно быть в реестре после деинсталляции.
Отсюда вывод - данные для инсталляции необходимо создавать динамически в самом процессе инсталляции. Причем эти данные можно использовать не только для восстановления системы после неудачной инсталляции, а и просто для обычной деинсталляции впоследствии.

Чтобы не быть голословным опять же приведу в пример свой Конструктор инсталляторов на основе 7z SFX (http://forum.oszone.net/thread-295084.html). Инсталляторы, созданные с его помощью, в процессе установки формируют файл UnCom.~ в папке с программой. В этот файл записывается все, что делает инсталлятор, в том числе и изменяемые параметры реестра. После установки в реестре создается ветка для деинсталляции программы с помощью стандартного апплета Установка и удаления программ, а команда для деинсталляции использует данные из UnCom.~, которые записываются в реестр, сам файл UnCom.~ после этого удаляется. Так вот, если перед распаковкой программы UnCom.~ будет находится в папке, в которую должна будет установиться программа, то после окна предупреждения команды для деинсталляции из него будут выполнены, удалена папка с программой и процесс инсталляции таксккиллится.

sov44
10-02-2017, 20:44
Можно чуть сократить код ExecuteOnLoad="hidcon:cmd /c FOR /F \"Tokens=1,2\" %I IN ('\"TASKLIST|FINDSTR /BILC:\"%%M\"\"') DO SET /A N+=1& cmd /v/c IF !N! GTR 1 TASKKILL /F /T /PID \"%J\""

ya158
10-02-2017, 22:20
sov44,
Я знаю. Просто я ещё добавляю окно с информацией и там приходится городить второй цикл For. Я привел код в качестве того, что можно не создавать доп файл.

Victor_Man
10-02-2017, 23:39
Цитата Ж.Д.А.Л.К.Е.Р.:
В справке по модифицированному модулю смотрим раздел "Файл конфигурации": »
Ну, это то я все знаю прекрасно...но оно проблемы не решает.
В ДЕЙСТВИТЕЛЬНОСТИ ВСЕ НЕ ТАК, КАК НА САМОМ ДЕЛЕ :)
Слэш то в переменной и с ним ничего нельзя сделать.

Вот пример.
У разных юзеров назначен %TEM% так:
%TEMP%=C:\Temp - вариант 1
%TEMP%=C:\Temp\ - вариант 2 (т.е. с концевым флэшем - такое встречается, хотя и не слишком часто)
и в конфигурационном файле 7zSFX записано:
InstallPath="%TEMP%\\PathProg"
RunProgram="Program.exe"
В варианте 1 7zSFX будет искать программу здесь: %TEMP%\PathProg\Program.exe - он успешно ее найдет и запустит
В варианте 2 7zSFX будет искать программу здесь: %TEMP%\PathProg\\Program.exe - и он ее не найдет (!)
А вот если доверить вопрос поиска cmd.exe, то все в порядке:
RunProgram="cmd /c Program.exe"
Также отработает правильно и такая строка:
RunProgram="waitall:Program.exe" (видимо потому, что в этом случае используется вызов через cmd.exe)
====================================
Короче, дольше писать - вот сделал за три минуты три примера.
https://www.upload.ee/files/6659834/InstallPath.rar.html
Запустите в каждом zz_Start.CMD и посмотрите результат.
Я писал именно об этом. О том, что мы не можем всех заставить поубирать слэши из TEMP.
Ну, остается вариант сказать сами виноваты...либо писать cmd /c или waitall.
====================================================
Разбираться стал, когда стали сообщать: Сборка не работает, не запускается даже!!! Одна, другая...- совершенно разные.
После разборок - вот она причина, %TEMP% со слешем.
Кстати, этим грешат "старые волки", которые DOS еще помнят, а там %TEMP% со слешем был почти за правило.
Видимо, с тех пор Windows и обрабатывает эту ситуацию, чтобы не было коллизий.

Victor_Man
11-02-2017, 00:22
ya158
Ну, чем больше вариантов - тем лучше, есть из чего выбрать :)
Без командного файла - это хороший вариант, в принципе.
Я не делаю сложных проектов, поэтому стараюсь делать из простых элементов.
Ну, и также размышления:
Я остался на варианте с файлом, который вторая копия запускает из разархивированной первой.
Соответственно, при запуске первой копии такого файла нет вообще (т.к. не было еще разархивации).
Дело в том, что я вдруг сделал SFX на AusLogic Disk Defrag, а он при запуске загружает систему до 100%.
И...с удивлением обнаружил, что при такой нагрузке бывают сбои в TaskKill - и второй процесс тоже запускается!
Особенно, если кликнуть еще пару раз для тестирования. Я стал тестировать, запуская сборки из .cmd по 5 штук :)
Понятно, что такого не может быть реально, но захотелось "разобраться досконально".
Вспомнил молодость с отладкой задач в реальном времени, с логами.
Выяснил, что иногда последний PID не свой, т.е. задачи убивают друг друга, вот тут и могут быть проблемы.
А вот если запрашивать не последний процесс, а PID родителя через WMIC, то там получается всегда свой PID.
Но там что-то все так медленно ворочается - я от варианта c WMIC отказался.
Одним словом, самый устойчивый оказался именно вариант с файлом, который вторая копия запускает из разархивированной первой.
Но еще раз - это все для запредельных вариантов, которые в жизни не встретятся...
===================================================
Добавил альтернативный вариант z1_KillTask.cmd (на WMIC/TaskKill вместо TaskList/TaskKill) - в принципе то он рабочий.
http://forum.oszone.net/post-2688624.html#post2688624

CryptoNick
11-02-2017, 08:30
Victor_Man, Со сторонними утилитами, выложенными в теме ранее, не хотите попробовать продолжить эксперименты?

Victor_Man
11-02-2017, 10:07
CryptoNick, какие имеются в виду?
А, tasktool...ну, гляну, может.
С убиванием непонятки были - на каждое нормальное завершение taskkill (0) приходилось аж 3 ошибочных (128)...
=======
Хотя, для нашего случая (единичный повторный запуск) все описанные решения через taskkill вполне рабочие, так что это уже не в тему, пожалуй.

CryptoNick
11-02-2017, 11:09
Еще как в тему... Как я писал, в WinPE может и не быть taskkill и tasklist

ya158
11-02-2017, 11:25
Я не делаю сложных проектов, поэтому стараюсь делать из простых элементов. »
Я и не говорю, что SFX 7-zip предназначен для сложных проектов. Например, установить AkelPad с нормальной заменой Блокнота гораздо проще с помощью nsis.
Я сделал свой Конструктор для упрощения составления файла конфигурации (чтобы не акцентировать свое внимание на правильности синтаксиса файла конфигурации - там слеш не задвоил, тут кавычки не заэкранировал) и для наиболее корректной деинсталляции, т.к. сам модуль SFX в явном виде не дает инструментов деинсталляции. Предотвращение повторного запуска удаление прерванной установки лично для меня не столь интересны, как, например, закрепление программы на панели задач с правами администратора или даже просто присвоение прав администратора ярлыку, созданному с помощью модуля.
Выяснил, что иногда последний PID не свой »
А чей же тогда PID? У двух процессов одинаковый PID?
А вот если запрашивать не последний процесс, а PID родителя через WMIC »
Недопонял - PID какого родителя?

Еще как в тему... Как я писал, в WinPE может и не быть taskkill и tasklist »
Ну ради таких WinPE таскать в дистрибутиве дополнительный файл - это как-то.... Если я не ошибаюсь, то taskkill/tasklist просто файлы. Тогда проще на той же флешке, где находятся инсталляторы иметь taskkill/tasklist, а в инсталляторах для этого случая организовать добавку пути к taskkill/tasklist в Path. А еще проще вставить в такой WinPE taskkill/tasklist.... Да и вообще - представим очень маловероятный сценарий: Запустили WinPE и обнаружили, что в оси нет необходимой, уже проинсталлированной, программы - решили установить и случайно запустили установку дважды. Ещё более маловероятно, что такая двойная установка что-то накосячит в WinPE или в самой программме, но и в этом случае можно просто перезагрузиться и снова аккуратно проинсталлировать нужную программу...

CryptoNick
11-02-2017, 11:56
ya158, Я сделал свой Конструктор для упрощения составления файла конфигурации
Ну не знаю, как упрощение.... Я в нем так и не разобрался... Как и в кнопке gora
И таких как я много...
Как альтернативу, всему мудреному, заумному, написал свою программу... (http://forum.oszone.net/thread-318016.html)
Ну ради таких WinPE таскать в дистрибутиве дополнительный файл - это как-то....
Одна утилита весит два килобайта, другая 8 килобайт.
Можно использовать первую... А вес у нее почти такой же как у батника-убийцы дубликата.
решили установить и случайно запустили установку дважды. Ещё более маловероятно, что такая двойная установка что-то накосячит в WinPE или в самой программме, но и в этом случае можно просто перезагрузиться и снова аккуратно проинсталлировать нужную программу...
Если извлекать в определенную папку, и потом, после окончания работы, само удалять данную папку...
При повторном запуске проекта и его закрытии, все не заблокированные файлы первого проекта, удаляются.
И если первому, они понадобятся, то будет ошибка...

ya158
11-02-2017, 12:16
Ну не знаю, как упрощение... »
Упрощение - ну, например, не надо в длинной строке внимательно отслеживать экранировку кавычек. У меня из-за невнимательности частенько бывает, что не замечаю в середине длинной строки, что не поставил слеш перед кавычками. Также, например, не надо вспоминать правильный синтаксис записи в реестр - указал в system.ini куст, имя и значение параметра и все. Надо изменить что-то в определенной секции - не нужно искать по всему файлу конфигурации. Я частенько пересобираю инсталляторы и мне проще просто запустить простой cmd-шник, зная, что он не просто соберет инсталлятор, но и также выставит в его свойствах соответствующие записи. А также автоматическое создание деинсталляции... Как-то так...
Я в нем так и не разобрался.. »
Если есть такое желание - прошу в соответствующую тем. С удовольствием помогу разобраться, заодно может найдутся какие-нибудь ошибки или подскажите путь для упрощения/модификации...
Как и в кнопке gora »
В ней я вижу только одну полезную функцию - быстро посмотреть файл конфигурации (все собираюсь сделать свою кнопку только для этой функции, но все руки не доходят). Распаковывать лучше с помощью самого 7-zip или с помощью UniversalExtractor-a, а создавать SFX мне проще батником.
Как альтернативу, всему мудреному, заумному, написал свою программу... »
Можно по-подробнее?...
Одна утилита весит два килобайта, другая 8 килобайт. »
Дело не в весе... Просто я считаю, что в дистрибутиве программы должна быть только сама программа и никаких служебных файлов.




© OSzone.net 2001-2012