1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

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

Тема в разделе "Inno Setup", создана пользователем Хамик, 19 апр 2014.

  1. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Подскажите как создать свои ключи командной строки в Inno Setup. Давали такой код (пример), но он не работает. Дайте какой-то другой вариант.
    Код (Text):
    [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;
     
    Последнее редактирование: 16 июл 2015
  2. Ветеран Проверенный

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

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    А как быть если уже есть чекова функция?
    Код (Text):
    Source: "{appP}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: ChangeLabel('portable'); Check: PortableCheck
    И еще хочу создать ключи для отмены создания ярлыков
    Код (Text):
    [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;
     
     
  4. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Код (Text):
    Source: "{appP}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: ChangeLabel('portable'); Check: PortableCheck and CheckParam('/p')
    Хотя что-то мне подсказывает, что вы в функции PortableCheck и так параметры проверяете :)
     
  5. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    А если написать через or вместо and будет правильно?
     
  6. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Будет
     
  7. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Со старым кодом было
    Код (Text):
    function PortableCheck: Boolean;
    begin
      Result := Portable.Checked or isportable;
    end;
     
  8. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Хамик, попробуйте так
    Код (Text):
    [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;
     
  9. Ветеран

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

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Пример. Если указан параметр /p или выбрана радиокнопка Portable, то в паку с программой установится папка MainFiles и PortableFiles, если не указан параметр и выбрана радиокнопка Simple, то установится только папка MainFiles.
     

    Вложения:

    • Sample.rar
      Размер файла:
      572 байт
      Просмотров:
      20
    Хамик нравится это.
  11. Ветеран

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

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

    Регистрация:
    15 июн 2011
    Сообщения:
    671
    Симпатии:
    948
    Пол:
    Мужской
    Хамик
    Код (Text):
    function InstallerCheck: Boolean;
    begin
    Result := Installer.Checked and not (Pos('/p', LowerCase(GetCmdTail)) > 0);
    end;
    Для ярлыков нужно же проверять отсутствие ключа, а не его наличие
    Код (Text):

    function PuskCheckParam: Boolean;
    begin
    Pusk.Checked := False; //Хз зачем тебе это
    Result := Pos('/NS', LowerCase(GetCmdTail)) <= 0; //Если ключа нет, то будут созданы ярлыки
    end;
     
  13. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Не работает. Все равно создается папка в меню пуск.
     
  14. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    671
    Симпатии:
    948
    Пол:
    Мужской
    Ну все правильно - я процитировал код, не заметив что используется LowerCase
    Как вариант изменить искомый ключ на "/ns", либо убрать функцию LowerCase
     
    Хамик нравится это.
  15. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Регистр что строгий здесь? Попробовал /ns тот же результат - не реагирует на ключ.
    Убрать это так?
    Код (Text):
    function PuskCheckParam: Boolean;
    begin
    Result := Pos('/NS', GetCmdTail) <= 0;
    end;
    Спасибо! Все заработало. Добавил проверку в секцию [Icon]
    Код (Text):
    [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;
     
    Последнее редактирование: 21 апр 2014
  16. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Есть способы изменить ключ тихой установки с /VERYSILENT на /S?
     
  17. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Народ помогите, плиз, создать аналог ключа /DIR=Путь на (/D=Путь). Дайте примерчик, способы которые здесь даны не помогают, либо я не знаю как правильно....
     
  18. Ветеран Проверенный

    Регистрация:
    19 дек 2011
    Сообщения:
    351
    Симпатии:
    401
    Код (Text):
    [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;
     
    Хамик нравится это.
  19. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Mailchik, спасибо Вам огромное, код рабочий.
     
    Последнее редактирование: 25 апр 2014
  20. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Не знаете, есть ли способ заменить сам ключ тихой установки (с /VERYSILENT на /S)? И сам способ командной строки тоисть без start /wait?
     

Поделиться этой страницей