Вопрос Как создать свои ключи командной строки?

ZVSRus

Участник
Вопрос ко всем кто пользуется командной строкой!
В примере
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={code:GetInstallDir|{pf}\My Application}
DisableProgramGroupPage=yes
Uninstallable=not PortableCheck
OutputDir=.

[Files]
Source: "MyProg - installer.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: InstallerCheck;
Source: "MyProg - portable.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: PortableCheck;

[Icons]
Name: "{commondesktop}\My Application"; Filename: "{app}\MyProg - installer.exe"; Check: InstallerCheck;
Код:
var
Portable,Installer: TNewRadioButton;

function CheckParam(s: string): boolean;
var
i: integer;
begin
for i := 0 to ParamCount do begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;

function GetInstallDir(S: String): String;
begin
if CheckParam('/P') then
Result:= ExpandConstant('{userdesktop}\My Application Portable')
else
Result:= ExpandConstant(S);
end;

function PortableCheck: Boolean;
begin
Result := Portable.Checked or CheckParam('/P');
end;

function InstallerCheck: Boolean;
begin
Result := Installer.Checked or CheckParam('/I');
end;

procedure InitializeWizard();
begin
WizardForm.DirEdit.Text:= ExpandConstant('{code:GetInstallDir|{pf}\My Application}');

Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(110);
Top := ScaleY(175);
Width := ScaleX(100);
Height := ScaleY(17);
Caption := 'Портативная';
Checked := CheckParam('/P');
end;

Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(175);
Width := ScaleX(100);
Height := ScaleY(17);
Caption := 'Стационарная';
Checked := not CheckParam('/P');
end;
end;
В том виде в каком он есть, код работает хорошо. Тихая установка, и Тихая распаковка происходит в соответствующие папки.
Но только когда прикручиваю к основному скрипту, на тихой распаковке выдаёт такую ошибку.
Что означает данная ошибка?
 

Вложения

Последнее редактирование:

Хамик

Старожил
Shegorat, в ходе тестов и экспериментов оказалось, что если указать название папки типа такого рода
Код:
setup.exe /VERYSILENT /D="D:\Пробная Директория Portable dir"
, то меняется как-бы кодировка (не знаю как это можно назвать) больших кириллических букв. Получается такое:9999.png . Но если использовать все маленькие буквы кириллици, то все норм: 888.png . Подскажите, как можно исправить этот баг?
 
Последнее редактирование:

ZVSRus

Участник
Хамик, это значить что что-то вызывается раньше его создания.
Суть ответа не понятна, что вызывается раньше, и раньше чего?.
 

Хамик

Старожил
ZVSRus, что угодно: функция, процедура, загрузка изображения, условие выполнения, инициализация установщика и т.д.
 

ZVSRus

Участник
Хамик, что угодно: функция, процедура, загрузка изображения, условие выполнения, инициализация установщика и т.д.
Тогда такой вопрос: Куда нужно вставить этот кусок кода?, и после каких функций и процедур стоит у вас.
PS. С одним разобрался. Было до безобразия просто.
Checked := CheckParam('/P'); стоя ниже OnClick := @CompClick;
поставил наоборот все заработало.
Возник другой вопрос, при тихой распаковке портативная версия распаковывается по своему адрусу {src} но также устанавливается и обычная версия в Program Files но уже без деинстоллятора.
 
Последнее редактирование:

ZVSRus

Участник
Что нужно дописать в коде при таких командный файлах:
"Setup.exe" /VERYSILENT /I /RU
"Setup.exe" /VERYSILENT /I /EN
"Setup.exe" /VERYSILENT /P
 
Последнее редактирование:

ZVSRus

Участник
Перепробовал все примеры! При тихой распаковке, обычная версия как устанавливалась так и устанавливается. Может кто подскажет, что к чему?
 

ZVSRus

Участник
Хамик Убрать ключ /I. Делать проверку только на /P
С тихой установкой и тихой распаковкой вроде разобрался, также разобрался с не созданием ярлыков.
Осталось с:
"Setup.exe" /VERYSILENT /I /RU
"Setup.exe" /VERYSILENT /I /EN,
в данной теме ни каких вариантов!
Решение найдено.
Последняя загвоздка
с прописыванием пути "setup.exe" /VERYSILENT /P /D="D:\MyPortable". Пример в данной теме не реагирует на данный путь.
Может не реагирует потому что в скрипте используется
(Result:= ExpandConstant('{src}\MyApplicationPortable')
 
Последнее редактирование:

ZVSRus

Участник
Что нужно изменить или дописать в данной функции для командного файла на закрепление ярлыка на панели задач для тихой установки. Чекбокс не отмечен


function
PanelZadachCheckParam: Boolean;
begin Result := Pos('/SZ', GetCmdTail) <= 0;
end;
 

vint56

Ветеран
Проверенный
Привет всем у меня такая проблема не знаю как исправить я добавил ключи установки Ru En а на радио батон добавил Ru.Checked := True; в сам Inno setup работает нормально но если делать через батник установку английской версий то и русская тоже устанавливается можно как нибудь исключить через ключ исключить его
#define MyAppName "VirtualDub"
#define MyAppVersion "5.0.7.39"
#define MyAppExeName "Veedub64.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={code:GetInstallDir|{pf}\{#MyAppName}}
DefaultGroupName={#MyAppName}
DirExistsWarning=no
ArchitecturesAllowed=x86 x64
ArchitecturesInstallIn64BitMode=x64
//==============================================================//
SolidCompression=yes
Compression=lzma/ultra64
InternalCompressLevel=Ultra64
LZMABlockSize=262144
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
MergeDuplicateFiles=yes
//==============================================================//
Uninstallable=not PortableCheck
CreateUninstallRegKey=not PortableCheck

//==============================================================//
[Files]
Source: "InstallFiles\*"; Flags: dontcopy;
;Source: "VirtualDub\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check:InstallerCheck;
;Source: "VirtualDubPortable\*"; DestDir: "{commondesktop}\VirtualDubPortable"; Flags: ignoreversion recursesubdirs createallsubdirs;Check: PortableCheck;

Source: C:\Users\Vitaly\Desktop\111\Veedub64eng.exe; DestDir: {app}; Check: InstallerCheck and Eng;
Source: C:\Users\Vitaly\Desktop\111\Veedub64rus.exe; DestDir: {app}; Check: InstallerCheck and Rus;
Source: C:\Users\Vitaly\Desktop\111\Veedub64engportable.exe; DestDir: {userdesktop}\VirtualDub Portable; Check: PortableCheck and Eng;
Source: C:\Users\Vitaly\Desktop\111\Veedub64rusportable.exe; DestDir: {userdesktop}\VirtualDub Portable; Check: PortableCheck and Rus;

//==============================================================//
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" ; Check:InstallerCheck and GroupIconsCheck;
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Check:InstallerCheck and GroupIconsCheck;
Name: "{commondesktop}\Ярлык(и) на «Рабочем столе"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: {app}; Check:InstallerCheck and DesktopIconsCheck;
;Name: "{commondesktop}\Ярлыки в меню «Пуск»"; Filename: "{app}\{#MyAppExeName}"; Check:InstallerCheck and GroupIconsCheck;
;Name: "{commondesktop}\Ярлык в панели задач"; Filename: "{app}\{#MyAppExeName}"; Check:InstallerCheck and TaskBarIconsCheck;
;Name: "{commondesktop}\Закрепить в меню «Пуск»"; Filename: "{app}\{#MyAppExeName}"; Check:InstallerCheck and StartMenuIconsCheck;


[code_]
//==============================================================//
#include "Modules\botva2.iss"
//==============================================================//
var
ComponentsPage: TWizardPage;
InstallerAndPortable, Icons,Lang: TNewGroupBox;
Installer,Portable,En,Ru: TNewRadioButton;
DesktopIcons,GroupIcons,TaskBarIcons,StartMenuIcons: TNewCheckBox;
InstallerPanel,PortablePanel: TPanel;
InstallerImage,PortableImage: Longint;

//==============================================================//
function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\Installer.png')) then ExtractTemporaryFile('Installer.png');
if not FileExists(ExpandConstant('{tmp}\Portable.png')) then ExtractTemporaryFile('Portable.png');
Result := True;
end;
//==============================================================//
function CheckParam(s: string): boolean;
var
i: integer;
begin
for i := 0 to ParamCount do begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;
//==============================================================//
function GetInstallDir(S: String): String;
begin
if CheckParam('/P') then
Result:= ExpandConstant('{userdesktop}\VirtualDub Portable')
else
Result:= ExpandConstant(S);
end;
//==============================================================//
function PortableCheck: Boolean;
begin
Result := Portable.Checked or CheckParam('/P');
end;
//==============================================================//
function InstallerCheck: Boolean;
begin
Result := Installer.Checked or CheckParam('/I');
end;
//==============================================================//
function DesktopIconsCheck: Boolean;
begin
Result:= DesktopIcons.Checked;
end;
//==============================================================//
function GroupIconsCheck: Boolean;
begin
Result:= GroupIcons.Checked;
end;
//==============================================================//
function TaskBarIconsCheck: Boolean;
begin
Result:= TaskBarIcons.Checked;
end;
//==============================================================//
function StartMenuIconsCheck: Boolean;
begin
Result:= StartMenuIcons.Checked;
end;
//==============================================================//
function Eng: Boolean;
begin
Result := (En.Checked and not CheckParam('/Ru')) or CheckParam('/En'));
end;
//==============================================================//
function Rus: Boolean;
begin
Result := (Ru.Checked and not CheckParam('/En')) or (CheckParam('/Ru'));
end;
//==============================================================//

procedure CopmpClick(Sender: TObject);
begin
case TNewRadioButton(Sender) of
Installer:
begin
DesktopIcons.Checked:=True;
DesktopIcons.Enabled:= DesktopIcons.Checked;
GroupIcons.Checked:=True;
GroupIcons.Enabled:= GroupIcons.Checked;
PortablePanel.Hide;
TaskBarIcons.Checked:=False;
TaskBarIcons.Enabled:= True;
StartMenuIcons.Checked:=False;
StartMenuIcons.Enabled:= True;
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + '{#MyAppName}';
end;
Portable:
begin
PortablePanel.Show;
DesktopIcons.Checked:=False;
DesktopIcons.Enabled:= DesktopIcons.Checked;
GroupIcons.Checked:=False;
GroupIcons.Enabled:= GroupIcons.Checked;
TaskBarIcons.Checked:=False;
TaskBarIcons.Enabled:= TaskBarIcons.Checked;
StartMenuIcons.Checked:=False;
StartMenuIcons.Enabled:= StartMenuIcons.Checked;
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{userdesktop}')) + '{#MyAppName} Portable';
end;
end;
end;
//==============================================================//
procedure InitializeWizard();
begin
//==============================================================//
ComponentsPage:= CreateCustomPage(wpWelcome, 'Выбор компонентов', 'Какие компоненты должны быть установлены?');
//==============================================================//
InstallerAndPortable:=TNewGroupBox.Create(WizardForm);
InstallerAndPortable.Parent := ComponentsPage.Surface;
InstallerAndPortable.Left := ScaleX(10);
InstallerAndPortable.Top := ScaleY(10);
InstallerAndPortable.Width := ScaleX(205);
InstallerAndPortable.Height := ScaleY(62);
InstallerAndPortable.Caption := 'Пожалуйста, выберите версию:';
//==============================================================//
Icons:=TNewGroupBox.Create(WizardForm);
Icons.Parent := ComponentsPage.Surface;
Icons.Left := ScaleX(10);
Icons.Top := ScaleY(70);
Icons.Width := ScaleX(205);
Icons.Height := ScaleY(105);
Icons.Caption := 'Ярлыки:';
//==============================================================//
//==============================================================//
Lang:=TNewGroupBox.Create(WizardForm);
Lang.Parent := ComponentsPage.Surface;
Lang.Left := ScaleX(10);
Lang.Top := ScaleY(175);
Lang.Width := ScaleX(205);
Lang.Height := ScaleY(60);
Lang.Caption := 'Выбор языка программы:';
//==============================================================//
InstallerPanel:= TPanel.Create(WizardForm);
InstallerPanel.Parent := ComponentsPage.Surface;
InstallerPanel.Left := ScaleX(236);
InstallerPanel.Top := ScaleY(16);
InstallerPanel.Width := ScaleX(180);
InstallerPanel.Height := ScaleY(180);
InstallerPanel.BevelOuter := bvNone;
//==============================================================//
PortablePanel:= TPanel.Create(WizardForm);
PortablePanel.Parent := ComponentsPage.Surface;
PortablePanel.Left := ScaleX(236);
PortablePanel.Top := ScaleY(16);
PortablePanel.Width := ScaleX(180);
PortablePanel.Height := ScaleY(180);
PortablePanel.BevelOuter := bvNone;
//==============================================================//
Installer:=TNewRadioButton.Create(WizardForm);
Installer.Parent :=InstallerAndPortable;
Installer.Left := ScaleX(8);
Installer.Top := ScaleY(15);
Installer.Width := ScaleX(170);
Installer.Height := ScaleY(17);
Installer.Caption := 'Установка обычной версий';
Installer.Checked := not CheckParam('/P');
Installer.OnClick:=@CopmpClick;
//==============================================================//
Portable:=TNewRadioButton.Create(WizardForm);
Portable.Parent := InstallerAndPortable;
Portable.Left := ScaleX(8);
Portable.Top := ScaleY(35);
Portable.Width := ScaleX(190);
Portable.Width := ScaleX(190);
Portable.Caption := 'Установка портативной версии';
Portable.Checked := CheckParam('/P');
Portable.OnClick:=@CopmpClick;
//==============================================================//
DesktopIcons:=TNewCheckBox.Create(WizardForm);
DesktopIcons.Parent := Icons;
DesktopIcons.Left := ScaleX(8);
DesktopIcons.Top := ScaleY(20);
DesktopIcons.Width := ScaleX(185);
DesktopIcons.Height := ScaleY(17);
DesktopIcons.Caption := 'Ярлык(и) на «Рабочем столе';
DesktopIcons.Checked:=true;
//==============================================================//
GroupIcons:=TNewCheckBox.Create(WizardForm);
GroupIcons.Parent := Icons;
GroupIcons.Left := ScaleX(8);
GroupIcons.Top := ScaleY(40);
GroupIcons.Width := ScaleX(161);
GroupIcons.Height := ScaleY(17);
GroupIcons.Caption := 'Ярлыки в меню «Пуск»';
GroupIcons.Checked:=true;
//==============================================================//
TaskBarIcons:=TNewCheckBox.Create(WizardForm);
TaskBarIcons.Parent := Icons;
TaskBarIcons.Left := ScaleX(8);
TaskBarIcons.Top := ScaleY(60);
TaskBarIcons.Width := ScaleX(137);
TaskBarIcons.Height := ScaleY(17);
TaskBarIcons.Caption := 'Ярлык в панели задач';
//==============================================================//
StartMenuIcons:=TNewCheckBox.Create(WizardForm);
StartMenuIcons.Parent := Icons;
StartMenuIcons.Left := ScaleX(8);
StartMenuIcons.Top := ScaleY(80);
StartMenuIcons.Width := ScaleX(153);
StartMenuIcons.Height := ScaleY(17);
StartMenuIcons.Caption := 'Закрепить в меню «Пуск»';
//==============================================================//
//==============================================================//
En:=TNewRadioButton.Create(WizardForm);
En.Parent :=Lang;
En.Left := ScaleX(8);
En.Top := ScaleY(15);
En.Width := ScaleX(170);
En.Height := ScaleY(17);
En.Caption := 'Английская версия программы';
//==============================================================//
Ru:=TNewRadioButton.Create(WizardForm);
Ru.Parent := Lang;
Ru.Left := ScaleX(8);
Ru.Top := ScaleY(35);
Ru.Width := ScaleX(190);
Ru.Width := ScaleX(190);
Ru.Caption := 'Русская версия программы';
Ru.Checked := True;
//==============================================================//
InstallerImage:=ImgLoad(InstallerPanel.Handle,ExpandConstant('{tmp}\Installer.png'),ScaleX(0),ScaleY(0),ScaleX(178),ScaleY(178),False,False);
ImgApplyChanges(InstallerPanel.Handle);
//==============================================================//
PortableImage:=ImgLoad(PortablePanel.Handle,ExpandConstant('{tmp}\Portable.png'),ScaleX(0),ScaleY(0),ScaleX(180),ScaleY(180),False,False);
ImgApplyChanges(PortablePanel.Handle);
//==============================================================//
end;
//=======================================================================================================================================================================//
//=======================================================================================================================================================================//
const
LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';

/////////////////////////////////////////////////////////////////////////
function PinToTaskbar(const szFilename: String; TaskBar, IsPin: Boolean): Boolean;
//szFilename: full path to executable file
//TaskBar: False - pin to StartMenu, True - pin to TaskBar
//IsPin: False - unpin from TaskBar/StartMenu, True - pin to TaskBar/StartMenu
var
hInst: THandle;
buf: array [0..255] of Char;
i, res: Integer;
strLnk, strVerb: String;
objShell, colVerbs: Variant;
begin
Result := False;
if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit;
if IsPin then
begin
if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
begin
while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
end;
if TaskBar then res := 5386 else res := 5381;
end else if TaskBar then res := 5387 else res := 5382;
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf, strVerb, i+1);
try
objShell := CreateOleObject('Shell.Application');
colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item.Name, strVerb) = 0 then
begin
colVerbs.Item.DoIt;
Result := True;
Break;
end;
except
Exit;
end;
finally
FreeDLL(hInst);
end;
end;
//=======================================================================================================================================================================//
procedure TaskbarStartMenu(CurPageID: integer);
begin
case CurPageID of
wpFinished: begin
if TaskBarIcons.Checked then
PinToTaskbar(WizardDirValue + '\{#MyAppExeName}', True, True);
if StartMenuIcons.Checked then
PinToTaskbar(WizardDirValue + '\{#MyAppExeName}', False, True);
end;
end;
end;
//=======================================================================================================================================================================//
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
instPath: string;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppName")}_is1',
'InstallLocation', instPath) then begin
case CurUninstallStep of
usUninstall: begin
PinToTaskbar(instPath + '\{#MyAppExeName}', True, False);
PinToTaskbar(instPath + '\{#MyAppExeName}', False, False);
end;
end;
end;
end;

//=======================================================================================================================================================================//
Procedure HideComponents();
begin
PortablePanel.Hide;
InstallerPanel.Hide;
end;
//=======================================================================================================================================================================//
Procedure ShowComponents(CurPageID: Integer);
begin
Case CurPageID of
ComponentsPage.ID:
begin
InstallerPanel.Show;
end;
end;
end;
//=======================================================================================================================================================================//
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if Portable.Checked then
begin
if (PageID = 8) then
Result:= True;
end;
end;
//=======================================================================================================================================================================//
procedure CurPageChanged(CurPageID: Integer);
begin
TaskbarStartMenu(CurPageID);
HideComponents;
ShowComponents(CurPageID);
end;
//=======================================================================================================================================================================//
procedure DeinitializeSetup();
begin
gdipShutdown;
end;
//=======================================================================================================================================================================//

Ru.Checked := False то все нормально но мне хотелось чтобы по умолчанию он был включен

Вот примеры батников
Installer- Eng
start /wait setup.exe /VERYSILENT /I /En
Installer- Rus
start /wait setup.exe /VERYSILENT /I /Ru
Portable - Eng
start /wait setup.exe /VERYSILENT /P /En
Portable - Rus
start /wait setup.exe /VERYSILENT /P /Ru


Пример обновил может кому пригодиться за исправления спасибо sergey3695

sergey3695, Большое спасибо за ответ
p.s. я подправил сам XD
 
Последнее редактирование:

AlexS

Новичок
Всем привет! Прошу помощи в решении проблемы(задачи).
Давненько в этой ветке форума задавался уже вопрос (от Хамика) по замене ключа тихой установки (/verysilent) коротким ключом (/S) как у других аналогов InnoSetup. Я тоже пробовал изобретать велосипед решая эту задачу, но успехов мало...
Решение нашел на oszone. Код был рабочий, но при использовании нескольких языков в инсталляторе, тихая установка с ключом (/S) работала криво.
Попросил помощи в решении проблемы там же на oszone... Откликнулся один очень хороший человек и помог. В ходе дальнейшего построения скрипта нарвался на очередную проблему по тихой установке и не понимаю где причина, а опять тревожить того хорошего человека уже как-то совестно (и так хорошо помог).
В обшем если запустить установщик со старым (/verysilent) и скомбинировать с какими-либо другими ключами, то все работает чётко.
Запускаю с ключом (/S) и с некоторыми другими, то тихая установка по ключу (/S) происходит скрыто, но не работают остальные ключи идущие с ним в команде. Тут нужно либо найти причину, по которой установка с ключом (/S) не хочет работать с другими ключами, либо может кто-то знает другой метод реализации сего...
Код:
[Setup]
AppName=My Program
AppVersion=1.1
DefaultDirName={pf}\My Program
DirExistsWarning=no
DisableDirPage=yes
DefaultGroupName=My Program
DisableWelcomePage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: "{app}\FileEng.txt"; DestDir: "{app}"; Check: "LEng"; Flags: ignoreversion
Source: "{app}\FileRus.txt"; DestDir: "{app}"; Check: "LRus"; Flags: ignoreversion
Source: "{app}\FileUkr.txt"; DestDir: "{app}"; Check: "LUkr"; Flags: ignoreversion

[Icons]
Name: "{group}\My Program\FileRus.txt"; Filename: "{app}\FileRus.txt"; Check: "LRus and StartMenuIcon";
Name: "{group}\My Program\FileEng.txt"; Filename: "{app}\FileEng.txt"; Check: "LEng and StartMenuIcon";
Name: "{group}\My Program\FileUkr.txt"; Filename: "{app}\FileUkr.txt"; Check: "LUkr and StartMenuIcon";
Name: "{commondesktop}\FileRus.txt"; Filename: "{app}\FileRus.txt"; Check: "LRus and DesktopIcon";
Name: "{commondesktop}\FileEng.txt"; Filename: "{app}\FileEng.txt"; Check: "LEng and DesktopIcon";
Name: "{commondesktop}\FileUkr.txt"; Filename: "{app}\FileUkr.txt"; Check: "LUkr and DesktopIcon";

[_Code]

var
  CustomPage: TWizardPage;
  LangRus, LangEng, LangUkr: TNewRadioButton;
  DesktopIconCheckBox, StartMenuCheckBox: TNewCheckBox;

function InitializeLanguageDialog(): Boolean;
var
  i : Integer;
begin
  Result := True;
  for i := 1 to ParamCount do
    if  LowerCase(ParamStr(i)) = '/s' then
    begin
      Result := False;
      Break;
    end;
end;

function InitializeSetup(): Boolean;
var
  i, ResultCode: Integer;
begin
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;
end;

function CheckParam(s: string): boolean;
var
  i: integer;
begin
  for i := 0 to ParamCount do begin
  Result := ParamStr(i) = s;
  if Result then Break;
end;
end;

function LRus: Boolean; begin Result:= LangRus.Checked or CheckParam('/RU') or CheckParam('/R'); end;
function LEng: Boolean; begin Result:= LangEng.Checked or CheckParam('/EN') or CheckParam('/E'); end;
function LUkr: Boolean; begin Result:= LangUkr.Checked or CheckParam('/UA') or CheckParam('/U'); end;
function DesktopIcon: Boolean; begin if not CheckParam('/ND') and not CheckParam('/NoDesktop') then Result := DesktopIconCheckBox.Checked end;
function StartMenuIcon: Boolean; begin if not CheckParam('/NM') and not CheckParam('/NoStartMenu') then Result := StartMenuCheckBox.Checked end;

procedure InitializeWizard();
begin
  { Custom wizard page }
  CustomPage := CreateCustomPage(wpSelectTasks, 'CustomPage_Caption', 'CustomPage_Description');

  { LangRus_RadioButton }
  LangRus := TNewRadioButton.Create(WizardForm);
  with LangRus do
  begin
    Parent := CustomPage.Surface;
    SetBounds(ScaleX(8),ScaleY(24),ScaleX(113),ScaleY(17));
    Caption := 'Русский';
    Checked:= not CheckParam('/RU') or not CheckParam('/R');
  end;

  { LangEng_RadioButton }
  LangEng := TNewRadioButton.Create(WizardForm);
  with LangEng do
  begin
    Parent := CustomPage.Surface;
    SetBounds(ScaleX(8),ScaleY(48),ScaleX(113),ScaleY(17));
    Caption := 'Английский';
    Checked:= CheckParam('/EN') or CheckParam('/E');
  end;

  { LangUkr_RadioButton }
  LangUkr := TNewRadioButton.Create(WizardForm);
  with LangUkr do
  begin
    Parent := CustomPage.Surface;
    SetBounds(ScaleX(8),ScaleY(72),ScaleX(113),ScaleY(17));
    Caption := 'Украинский';
    Checked:= CheckParam('/UA') or CheckParam('/U');
  end;

  { DesktopIcon_CheckBox }
  DesktopIconCheckBox := TNewCheckBox.Create(WizardForm);
  with DesktopIconCheckBox do
  begin
    Parent := CustomPage.Surface;
    SetBounds(ScaleX(8),ScaleY(130),ScaleX(166),ScaleY(17));
    Caption := 'Ярлык на рабочем столе';
    Checked:=not CheckParam('/ND') or not CheckParam('/NoDesktop');
  end;
  { StartMenu_CheckBox }
  StartMenuCheckBox := TNewCheckBox.Create(WizardForm);
  with StartMenuCheckBox do
  begin
    Parent := CustomPage.Surface;
    SetBounds(ScaleX(8),ScaleY(150),ScaleX(166),ScaleY(17));
    Caption := 'Ярлыки в меню Пуск';
    Checked:=not CheckParam('/NM') or not CheckParam('/NoStartMenu');
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
CustomPage.ID:
  begin
    WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
  end;
end;
end;
 

LexBell

Борода
Супер модератор
AlexS, да мне нетрудно ) разгадка простая, Читай внимательно комментарии
Код:
function InitializeSetup(): Boolean;
var
i, ResultCode: Integer;
begin
  for i := 1 to ParamCount do// перебираем параметры
  if LowerCase(ParamStr(i)) = '/s' then //если находим параметр /s
  begin//то запускаем  инсталлятор заново с единственным ключем /verysilent, остальные идут лесом
    Exec(ExtractFileName(ExpandConstant('{srcexe}')), '/verysilent', ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
    Exit;// из текущего процесса мы тут выходим.
  end;
  Result := True;
end;
дай список подменных ключей, сделаю функцию, чтобы все работало как нужно
 

Shegorat

Lord of Madness
Администратор
AlexS, там не передаются параметры при перезапуске инсталлера. Держи
Код:
function InitializeSetup(): Boolean;
var
  i, k, ResultCode: Integer;
  params, p: String;
begin
  for i := 1 to ParamCount do begin

    // Skip non /S paramters
    if LowerCase(ParamStr(i)) <> '/s' then
      Continue;

    // Build param string
    params:= '';
    for k := 1 to ParamCount do begin

      // Skip /S option
      if (k = i) then
        Continue;

      // Skip srcexe and /SL5 params
      p:= ParamStr(k);
      if (Pos('/SL5', p) = 1) or (Pos(ExpandConstant('{srcexe}'), p) = 1) then
        Continue;

      // Append parameter
      params:= params + ' ' + AddQuotes(p);
    end;

    Exec(ExtractFileName(ExpandConstant('{srcexe}')), '/verysilent' + params, ExtractFileDir(ExpandConstant('{srcexe}')), SW_SHOWNORMAL, ewNoWait, ResultCode);
    Exit;
  end;

  Result := True;
end;
 

Shegorat

Lord of Madness
Администратор
sergey3695, кода поменьше, таки да. Но StringChange не ignorecase функция и есть вероятность, что зацепит другие параметры, которые начинаются на /s

ЗЫ Еще пропадает экранирование параметров кавычками
 
Последнее редактирование:

AlexS

Новичок
LexBell, я так понимаю Вы и есть тот хороший человек с другого форума (аватарка одинаковая). Если так, то ещё раз спасибо за отзывчивость и помощь.
Shegorat, спасибо большое! Код рабочий!
sergey3695, запустил и получил бесконечную установку по кругу, пришлось повозиться, чтобы остановить. Но всё равно спасибо и Вам!
 

AlexS

Новичок
Доброго времени суток. Снова у меня "поломка" среди ключей тихой установки.
На этот раз с компонентами.
В общем стоит задача не использовать стандартный ключ /COMPONENTS="" с перечислением нужных компонентов, а задать компонентам короткие ключи тихой установки...
Код:
;InnoSetupVersion=5.5.1 ee2(a)
#define MyAppName "My Program"
#define MyAppVersion "1.1.1"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DisableWelcomePage=yes
DisableDirPage=yes

[Types]
Name: "custom"; Description: "Custom installation"; Flags: iscustom;

[Components]
Name: "CompA"; Description: "{cm:CompLabelA}"; Types: "custom"; Check: "RegConvert";
Name: "CompB"; Description: "{cm:CompLabelB}"; Check: "HelpInst";

[Files]
Source: "{app}\ExeFile1.exe"; DestDir: "{app}"; Components: "CompA" ; Flags: ignoreversion
Source: "{app}\HelpFile.chm"; DestDir: "{app}"; Components: "CompB" ; Flags: ignoreversion

[Languages]
Name: "en"; MessagesFile: "compiler:Languages\english.isl";
Name: "ru"; MessagesFile: "compiler:Languages\russian.isl";

[CustomMessages]
ru.CompLabelA=Конвертер
ru.CompLabelB=Справка
en.CompLabelA=Converter
en.CompLabelB=Help

[_Code]

function CheckParam(s: string): boolean;
var
i: integer;
begin
for i := 0 to ParamCount do begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;

//***Функции для отключения чекбоксов компонентов***\\
//  Тут вроде работает, но чувствую, что то-то не так...
function RegConvert: Boolean; begin if not CheckParam('/NK') and not CheckParam('/NoRegConverter') then Result := True; end;
//***Функции для включения чекбоксов компонентов***\\
//  Тут не работает...
function HelpInst: Boolean;
begin
begin
  if CheckParam('/IH') and CheckParam('/InstallHelp')
  then
  WizardForm.ComponentsList.Checked[1] := True;
  //IsComponentSelected('CompB');
  end;
Result := True;
end;
 

LexBell

Борода
Супер модератор
// Тут не работает...
Result := True; Эта строчка у тебя безусловна. тоесть, HelpInst всегда вернет True, невзирая ни на какие ключи.
Код:
function HelpInst: Boolean;
begin
  if CheckParam('/IH') and CheckParam('/InstallHelp')
  then begin
    WizardForm.ComponentsList.Checked[1] := True;
    Result := True;
  end;
end;
 
Сверху