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

Хамик

Старожил
Подскажите как создать свои ключи командной строки в Inno Setup. Давали такой код (пример), но он не работает. Дайте какой-то другой вариант.
Код:
[Files]
Source: "{port}\*"; DestDir: "{code:GetPath}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check: Portable

[Code]

var isportable : boolean;

function Portable: Boolean;
begin
  Result := PortableRadioButton.Checked or isportable;
end;

Function InitializeSetup: Boolean;
var i : integer;
Begin
  for i:=2 to ParamCount do begin
  if ( Pos(LowerCase('/p'), Lowercase(ParamStr(i))) > 0 ) then isportable := true else isportable := false;
end;//for
end;
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
Хамик, Пример:При нахождении ключа "/p" - из папки {src} будут копироваться все файлы в папку {app}.
 

Хамик

Старожил
А как быть если уже есть чекова функция?
Код:
Source: "{appP}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: ChangeLabel('portable'); Check: PortableCheck
И еще хочу создать ключи для отмены создания ярлыков
Код:
[Icons]
Name: "{commondesktop}\Programmer's Notepad"; Filename: "{app}\{#MyAppExeName}"; BeforeInstall: ChangeLabel('icon'); Check: CheckIcon; MinVersion: 0.0,5.0;
Name: "{commonprograms}\{#MyAppName}\Удалить {#MyAppName}"; Filename: {uninstallexe}; BeforeInstall: ChangeLabel('icon'); Check: PuskCheck; MinVersion: 0.0,5.0;
Name: "{commonprograms}\{#MyAppName}\Сайт {#MyAppName} в Интернете"; FileName: {#MyAppURL}; BeforeInstall: ChangeLabel('icon'); Check: PuskCheck; MinVersion: 0.0,5.0;
Name: "{commonprograms}\{#MyAppName}\Programmer's Notepad"; Filename: "{app}\pn.exe"; BeforeInstall: ChangeLabel('icon'); Check: PuskCheck; MinVersion: 0.0,5.0;
 

YURSHAT

Тех. админ
Администратор
А как быть если уже есть чекова функция?
Код:
Source: "{appP}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: ChangeLabel('portable'); Check: PortableCheck and CheckParam('/p')
Хотя что-то мне подсказывает, что вы в функции PortableCheck и так параметры проверяете :)
 

YURSHAT

Тех. админ
Администратор
Хамик, попробуйте так
Код:
[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа
OutputDir=.

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs; Check: IsPortable

[Code]
var
  PortableRadio, FullRadio: TNewRadioButton;

function IsPortable: Boolean;
begin
  Result := (PortableRadio.Checked) or (Pos('/p', LowerCase(GetCmdTail)) > 0);
end;

procedure InitializeWizard();
begin
  PortableRadio := TNewRadioButton.Create(WizardForm);
  with PortableRadio do
  begin
    Parent := WizardForm;
    Left := ScaleX(8);
    Top := ScaleY(328);
    Caption := 'Portable';
  end;

  FullRadio := TNewRadioButton.Create(WizardForm);
  with FullRadio do
  begin
    Parent := WizardForm;
    Left := ScaleX(80);
    Top := ScaleY(328);
    Checked := True;
    Caption := 'Full';
  end;
end;
 

Хамик

Старожил
YURSHAT, уже есть реакция на ключ, но оно и обычную версию устанавливает тоже... У меня так и прописано. В шапку выложил скрипт для визуального просмотра, может у кого-то появится какая-то идея. Секция [Source] урезана. Может важно: запускаю через .cmd файл с параметром start /wait setup.exe /VERYSILENT /p
 

YURSHAT

Тех. админ
Администратор
Пример. Если указан параметр /p или выбрана радиокнопка Portable, то в паку с программой установится папка MainFiles и PortableFiles, если не указан параметр и выбрана радиокнопка Simple, то установится только папка MainFiles.
 

Вложения

Хамик

Старожил
YURSHAT, чисто ваш код работает, но когда я его подставил в свой скрипт то выскакивают ошибки Could not call proc. и Acess violation at address 00000000. Write of address 00000000. (все через командную строку делаю). Проблема в OnClick:=@CopmpClick; в моем скрипте. Как их совместить? Процедура procedure CopmpClick(Sender: TObject); в моем скрипте обязательна без неё никак...
Все разобрался конфликты были именно на строки
Код:
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf}')) + '{#MyAppName}';
и
Код:
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{commondesktop}')) + '{#MyAppName} Portable';
в процедуре CopmpClick.

Теперь такой вопрос: как создать такой ключ для отмены создания ярлыков при установке обычной версии в тихом режиме?
Думал так сработает..... не работает
Код:
function PuskCheckParam: Boolean;
begin
Pusk.Checked := False;
Result := Pos('/NS', LowerCase(GetCmdTail)) > 0;
end;
 

Shegorat

Lord of Madness
Администратор
Хамик
Код:
function InstallerCheck: Boolean;
begin
Result := Installer.Checked and not (Pos('/p', LowerCase(GetCmdTail)) > 0);
end;
Для ярлыков нужно же проверять отсутствие ключа, а не его наличие
Код:
function PuskCheckParam: Boolean;
begin
Pusk.Checked := False; //Хз зачем тебе это
Result := Pos('/NS', LowerCase(GetCmdTail)) <= 0; //Если ключа нет, то будут созданы ярлыки
end;
 

Shegorat

Lord of Madness
Администратор
Не работает. Все равно создается папка в меню пуск.
Ну все правильно - я процитировал код, не заметив что используется LowerCase
Как вариант изменить искомый ключ на "/ns", либо убрать функцию LowerCase
 

Хамик

Старожил
Как вариант изменить искомый ключ на "/ns"
Регистр что строгий здесь? Попробовал /ns тот же результат - не реагирует на ключ.
либо убрать функцию LowerCase
Убрать это так?
Код:
function PuskCheckParam: Boolean;
begin
Result := Pos('/NS', GetCmdTail) <= 0;
end;
Спасибо! Все заработало. Добавил проверку в секцию [Icon]
Код:
[Icons]
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; BeforeInstall: ChangeLabel('icon'); Check: CheckIcon and CheckIconParam; MinVersion: 0.0,5.0;
Name: "{commonprograms}\{#MyAppName}\Удалить {#MyAppName}"; Filename: {uninstallexe}; BeforeInstall: ChangeLabel('icon'); Check: PuskCheck and PuskCheckParam; MinVersion: 0.0,5.0;
Name: "{commonprograms}\{#MyAppName}\Сайт {#MyAppName} в Интернете"; FileName: {#MyAppURL}; BeforeInstall: ChangeLabel('icon'); Check: PuskCheck and PuskCheckParam; MinVersion: 0.0,5.0;
Name: "{commonprograms}\{#MyAppName}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; BeforeInstall: ChangeLabel('icon'); Check: PuskCheck and PuskCheckParam; MinVersion: 0.0,5.0;
 
Последнее редактирование:

Хамик

Старожил
Народ помогите, плиз, создать аналог ключа /DIR=Путь на (/D=Путь). Дайте примерчик, способы которые здесь даны не помогают, либо я не знаю как правильно....
 

Mailchik

Старожил
Проверенный
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
function GetDirFromCMD(kWord: string): string;
var
   i, lStr: integer;
begin
   Result := WizardDirValue;
   lStr := Length(kWord);
   for i := 0 to ParamCount do begin
      if Pos(LowerCase(kWord), LowerCase(ParamStr(i))) > 0 then begin
         Result := Copy(ParamStr(i), Pos(LowerCase(kWord), LowerCase(ParamStr(i))) + lStr,
                        Length(ParamStr(i)) - lStr);

         while (Result[1] = '"') and (Result[Length(Result)] = '"') do
         begin
            Delete(Result, Length(Result), 1);
            Delete(Result, 1, 1);
         end;
      end;
      if Result <> WizardDirValue then
         Break;
   end;
end;

procedure InitializeWizard;
begin
   WizardForm.DirEdit.Text := GetDirFromCMD('/D=');
end;
 

Хамик

Старожил
Не знаете, есть ли способ заменить сам ключ тихой установки (с /VERYSILENT на /S)? И сам способ командной строки тоисть без start /wait?
 
Сверху