Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
Nordek, Я видел "532" пост, когда искал решение "удаление перед установкой" несколько раз.
Не понимая заданного вопроса "TROY Diamond" (Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками) - просто проходил мимо.
Теперь понял, спасибо за наводку :hi:
Но мне не то нужно, может есть возможность выполнить батник, или же конслольные команды после нажатия на финиш инсталлятора?
Банально мне нужно чтобы мой инсталятор само уничтожался после выполнения, как это делает unins000.exe...
procedure CurStepChanged(CurStep: TSetupStep);
var ResultCode: Integer;
begin
if CurStep = ssDone then
begin
SaveStringToFile(ExpandConstant('{userappdata}\del.bat'), '@echo off' +#13#10+ ':trydel' +#13#10+ 'del "' + ExpandConstant('{srcexe}') + '"' +#13#10+ 'if exist "' + ExpandConstant('{srcexe}') + '" goto trydel' +#13#10+ 'del "' + ExpandConstant('{userappdata}\del.bat') + '"', False);
Exec(ExpandConstant('{userappdata}\del.bat'), '', '', SW_HIDE, ewNoWait, ResultCode);
end;
end;
Буду признателен. Не нашел (плохо искал наверно)
у меня папка установки берется из реестра. ={reg:HKLM64\SOFTWARE\Avid\install,Main Path} (как пример)
Все нормально никаких проблем. Мне просто нужно чтобы при установке этот путь показывался но НЕ давал сменить.
в Inno Script Studio пробовал. или не нашел или просто не появляется путь вообще.
Спасибо заранее.
Gnom_aka_Lexander
09-03-2020, 18:43
показывался но НЕ давал сменить. »
procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.Enabled := False;
WizardForm.DirEdit.Enabled := False;
end;
Всем доброго вечера! Давненько я думал избавиться от длинного ключа тихой установки (/verysilent) и заменить его коротким (/S) как у других аналогов InnoSetup.
Читая архив наткнулся на уже готовое решение (http://forum.oszone.net/post-2410544-1712.html)...
Взял на испытание. В целом код с задачей справляется хорошо, но нашёл одно НО. Заключается оно в регистре.
Ключ в нижнем регистре отрабатывает хорошо, а в верхнем не хочет.
Долго уже чешу бестолковку :clever-ma , но решить задачу не могу.
Прошу помощи в решении задачи с верхним регистром или может у кого-нибудь есть другое решение замены длинного ключа на короткий.
Вопрос снимаю. Опробовал на другом компьютере и всё работает в верхнем и нижнем регистре.
Видать у меня в системе проблемы...
Хотя, если есть у кого-нибудь альтернативные решения буду рад взглянуть!!!
Новая проблема с этим (http://forum.oszone.net/go.php?url=http://forum.oszone.net/post-2410544-1712.html) кодом (писал о нем несколькими сообщениями ранее).
Добавил языки в инсталлятор и тихая установка при помощи этого кода не работает.
При запуске с коротким ключом "/S" выводит окно выбора языка (чего не должно быть), жму "Ок" и дальше устанавливает тихо.
Если в функции InitializeSetup параллельно происходят еще какие-то операции (в моем случае это распаковка некоторых *.bmp во временную папку),
то при запуске с коротким ключом выводит окно выбора языка, после нажатия "Ок" и установка проходит в обычном режиме с показом всех последующих окон.
[Setup]
AppName=Silent Install Key
AppVerName=Silent Install Key v 1.0
OutputBaseFilename=SilentInstallKey_setup
DefaultDirName={pf}\SilentInstallKey
CreateAppDir=no
[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Code]
function InitializeSetup(): Boolean;
var
i, ResultCode: Integer;
begin
for i := 1 to ParamCount do
if LowerCase(ParamStr(i)) = '/S' then
begin
Exec(ExtractFileName(ExpandConstant('{srcexe}')), '/verysilent', ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
Exit;
end;
Result := True;
end;
Прошу помощи в решении задачи...
Gnom_aka_Lexander
20-03-2020, 19:05
Alex S, Так не пробовал?
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[_Code]
function InitializeSetup(): Boolean;
var
i, ResultCode: Integer;
begin
// проверяем с 1, потому что ParamStr(0) всегда будет имя исполняемого файла
for i := 1 to ParamCount do
if LowerCase(ParamStr(i)) = '/v' then
begin
Exec(ExtractFileName(ExpandConstant('{srcexe}')), '/verysilent /LANG=english', ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
Exit;
end;
Result := True;
end;хотя, если верить справке, именно ключ /LANG может вызвать окно запроса выбора языка.
Можно еще такой вариант попробовать:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[_Code]
function InitializeLanguageDialog(): Boolean;
var
i : Integer;
R : Boolean;
begin
Result := True;
R := False;
for i := 1 to ParamCount do
begin
R := LowerCase(ParamStr(i)) = '/verysilent';
if R then Break;
end;
if R then Result := False; // тут конструкция в виде Result := not R; может криво стработать, поэтому надежнее так.
end;
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[_Code]
function InitializeLanguageDialog(): Boolean;
var
i : Integer;
begin
Result := True;
for i := 1 to ParamCount do
if LowerCase(ParamStr(i)) = '/verysilent' then
begin
Result := False;
Break;
end;
end;
Gnom_aka_Lexander, спасибо большое!
Приклеил к исходному коду Вашу функцию InitializeLanguageDialog и всё стало работать нормально.
В InitializeSetup ключ /LANG не понадобился...
Первые тесты пока без глюков.
Gnom_aka_Lexander
21-03-2020, 22:06
Alex S, function InitializeLanguageDialog(): Boolean;
begin
Result := Pos('/verysilent', LowerCase(GetCmdTail))=-1;
end;
Вспомнил, есть еще WizardSilent:
function InitializeLanguageDialog(): Boolean;
begin
Result := not WizardSilent;
end;
Всё верно, работает.
При таком варианте тихая установка проходит успешно, а вот при запуске установщика в обычном режиме не отображается окно выбора языка...
Предыдущий вариант пока работает нормально. Тестирую дальше...
Спасибо за помощь! :bow:
Здравствуйте знатоки. Вопросик.
Есть папки (source) например Папка1, Папка2
Что нужно сделать чтобы после компиляции был не общий BIN а папка1.bin папка2.bin ну и общий exe.
Т.е что бы в случае их изменения менялись только они .
Надеюсь понятно пояснил.
Спасибо.
и еще Возможно ли это
есть код заменяющий строчку в текстовом файле. Нужно чтобы поменялся на ссылку {app}
procedure CurStepChanged(CurStep: TSetupStep);
var
UnicodeStr: string;
ANSIStr: AnsiString;
begin
if (CurStep = ssPostInstall) then
begin
LoadStringFromFile(ExpandConstant('{app}\Files\ops.txt'), ANSIStr)
UnicodeStr := String(ANSIStr);
StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "{app}"', False)
SaveStringToFile(ExpandConstant('{app}\Files\ops.txt'), AnsiString(UnicodeStr), False);
end;
end;
всем кто ответит пивА и девочек на выбор )))
Gnom_aka_Lexander
24-03-2020, 19:56
VLADEV, первое - невозможно без применения внешних архиваторов вместо встроенного сжатия . по второму -DSTCOPY = "{app}" нужно заключить в ExpandConstant. либо, как на другом форуме подсказали, использовать WizardDirValue
Спасибо огромное.
WizardDirValue действительно отлично помог.
только мне надо ссылку в кавычки. а знаний не хватает
т.е у меня щаз предположим C:\Program Files (x86) а нужно "C:\Program Files (x86)"
Gnom_aka_Lexander,
1 вопрос это больше хотелка. поиском пробовал ничего вразумительного не нашел.
Если это сложно для новичка , то пока хотелку закрою.
Gnom_aka_Lexander
24-03-2020, 22:43
VLADEV, Сам файл случайно не ини? StringChangeEx(UnicodeStr, 'DSTCOPY', 'DSTCOPY = "'+ExpandConstant('{app}')+'"', False)
Как-то так будет с кавычками
ФЛУД.
От всей души желаю тебе сисястую любовницу. ))))
Нет файл простой текст
VLADEV, Есть папки (source) например Папка1, Папка2
Что нужно сделать чтобы после компиляции был не общий BIN а папка1.bin папка2.bin ну и общий exe.
Т.е что бы в случае их изменения менялись только они . »
Способ 1: папка1.bin папка2.bin как архивы
Включаем в состав установщика распаковщик (7-Zip, UnRAR, ...)
Через ExtractTemporaryFile() извлекаем распаковщик
Через Exec() его запускаем для распаковки архива папка1.bin
Через Exec() его запускаем для распаковки архива папка2.bin
Способ 2: папка1.bin папка2.bin как inno-установщики
// Прокатит или нет - не знаю, надо проверять. Но теоретически вместо .exe можно использовать любое расширение.
Через Exec() запускаем для распаковки архивов inno-установщик с именем папка1.bin
Через Exec() запускаем для распаковки архивов inno-установщик с именем папка2.bin
В целом:
Точкой входа в запуск всего этого шаманства может быть либо скрипт (bat/wsh/ps/...), либо базовый .iss-скрипт с использованием директив препроцессора.
Как сравнивать соответствие папки и готового bin? Можно на стадии сборки (например, препроцессором) читать файл со списком файлов и свойствами, по которым будет детектиться соответствие/различие и сравнивать, параллельно писать новый файл (для целей замены, если понадобится собирать новый *.bin)
С виду это может показаться лютым шаманством, но на самом деле, применив простенький скилл "Декомпозиция (https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F)", задача решится, пусть и не за два клика.
Всё это теория, но практика будет с конкретным ТЗ
Добрый День Форумчане! Пришел опять к вам за советом, как можно убрать описание файла, и его версию?
https://i111.fastpic.ru/big/2020/0329/ab/eec63e08df1747497cddc1cdeca8e0ab.jpg (https://fastpic.ru/view/111/2020/0329/eec63e08df1747497cddc1cdeca8e0ab.jpg.html)
Может сторонним софтом можно удалить эти данные?
как можно убрать описание файла, и его версию? »
Если редактирование "SetupLdr.e32" не помогает, то, видимо, ни как.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.