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

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

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

  1. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Mailchik,

    Как в вашем примере указать чтобы не создавался деинсталлятор (но только чтобы при наличии ключа, если ключ не указан то деинсталлятор создавался)???
    Код (Text):
    #define MyAppName "Programmer's Notepad"
    #define P "Portable"
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={pf}\{#MyAppName}

    [Files]
    Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check: CheckParam('/i');
    Source: "{appP}\*"; DestDir: "{userdesktop}\{#MyAppName} {#P}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check: CheckParam('/p');

    [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;
     
  2. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    693
    Симпатии:
    1.019
    Пол:
    Мужской
    Хамик
    Код (Text):
    [Setup]
    Uninstallable=not CheckParam('/p')
    Не проверял, но должно сработать
     
  3. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Shegorat, Спасибо! Сработало, но почему-то создается пустая папка с названием программы в Program Files... Как исправить этот дефект?
    немного дополнил свой скрипт
    Код (Text):
    #define MyAppName "Programmer's Notepad"
    #define P "Portable"
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={pf}\{#MyAppName}
    Uninstallable=not CheckParam('/P')
    [Files]
    Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check: CheckParam('/I');
    Source: "{appP}\*"; DestDir: "{userdesktop}\{#MyAppName} {#P}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check:CheckParam('/P');

    [Code]
    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 PortableCheck: Boolean;
    begin
      Result := Portable.Checked;
    end;

    function InstallerCheck: Boolean;
    begin
      Result := Installer.Checked;
    end;

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

      Installer := TNewRadioButton.Create(WizardForm);
      with Installer do
      begin
        Parent := WizardForm.WelcomePage;
        Left := ScaleX(210);
        Top := ScaleY(295);
        Width := ScaleX(100);
        Height := ScaleY(17);
        Caption := 'Стационарная';
        Checked := not CheckParam('/P');
      end;
      end;
     
    Последнее редактирование: 27 апр 2014
  4. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    693
    Симпатии:
    1.019
    Пол:
    Мужской
    Хамик, Думаю как-то так
    Код (Text):

    #define MyAppName "Programmer's Notepad"
    #define MyAppName2 "Programmer''s Notepad"
    #define P "Portable"
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={code:GetInstallDir|{pf}\{#MyAppName}}
    Uninstallable=not PortableCheck

    [Files]
    Source: "app\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check: InstallerCheck;
    Source: "appP\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs; Check: PortableCheck;

    [Code]
    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')) or (Assigned(Portable) and Portable.Checked)) then
        Result:= ExpandConstant('{userdesktop}\{#MyAppName2} {#P}')
      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
      Portable := TNewRadioButton.Create(WizardForm);
      with Portable do
      begin
        Parent := WizardForm.WelcomePage;
        Left := ScaleX(320);
        Top := ScaleY(295);
        Width := ScaleX(100);
        Height := ScaleY(17);
        Caption := 'Портативная';
        Checked :=CheckParam('/P');
      end;

      Installer := TNewRadioButton.Create(WizardForm);
      with Installer do
      begin
        Parent := WizardForm.WelcomePage;
        Left := ScaleX(210);
        Top := ScaleY(295);
        Width := ScaleX(100);
        Height := ScaleY(17);
        Caption := 'Стационарная';
        Checked := not CheckParam('/P');
      end;
    end;
     
    Stealthmax и Хамик нравится это.
  5. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Shegorat, Не знаете, что нужно изменить в коде чтобы работало наоборот ( тоесть при наличии ключа действие не происходило)?
    Код (Text):
    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;
     
  6. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    693
    Симпатии:
    1.019
    Пол:
    Мужской
    Хамик, Ну либо при вызове использовать not
    Код (Text):
    not CheckParam('/myparam')
    Либо
    Код (Text):

    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;
      Result:= not Result;
    end;
     
     
    Хамик и Mailchik нравится это.
  7. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Shegorat, А можно как-то сделать чтобы этот код допускал и нижний регистр?
     
  8. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Shegorat, Здравствуйте, обнаружился не большой баг в коде. Если установить стационарную версию, а потом распаковать портативную, то портативная распаковуется в ту же папку что и стационарная установилась. Подскажите как исправить? Просто при тихой установке папка по умолчанию должна быть для обычной версии Program Files, а для портативной Рабочий стол. Проверил наоборот, сначала установил потрабл а потом стационарную, то все норм.....каждая версия в свою папку установилась.
    Код (Text):
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={code:GetInstallDir|{pf}\My Application}
    Uninstallable=not PortableCheck

    [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;

    [Code]
    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')) or (Assigned(Portable) and Portable.Checked)) 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
      Portable := TNewRadioButton.Create(WizardForm);
      with Portable do
      begin
        Parent := WizardForm.WelcomePage;
        Left := ScaleX(320);
        Top := ScaleY(295);
        Width := ScaleX(100);
        Height := ScaleY(17);
        Caption := 'Портативная';
        Checked :=CheckParam('/P');
      end;

      Installer := TNewRadioButton.Create(WizardForm);
      with Installer do
      begin
        Parent := WizardForm.WelcomePage;
        Left := ScaleX(210);
        Top := ScaleY(295);
        Width := ScaleX(100);
        Height := ScaleY(17);
        Caption := 'Стационарная';
        Checked := not CheckParam('/P');
      end;
    end;
     

    Вложения:

    • Test.rar
      Размер файла:
      3,2 КБ
      Просмотров:
      13
    Последнее редактирование: 30 май 2014
  9. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.049
    Симпатии:
    703
    Хамик,
    Код (Text):
    [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;

    [Code ]
    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;
     
    Хамик нравится это.
  10. Новичок

    Регистрация:
    29 авг 2014
    Сообщения:
    3
    Симпатии:
    0
    Пол:
    Мужской
    Ребята, у меня есть "InstallerCheck and BeautyCheck, ,InstallerCheck and BrightnessCheck, PortableCheck and BeautyCheck, PortableCheck and BrightnessCheck, InstallerCheck and PlaginsCheck and BeautyCheck, InstallerCheck and PlaginsCheck and BrightnessCheck" и т.д. Как мне сделать ключи командной строки?
    К примеру хотелось бы сделать так:
    Установка Beauty Guide - setup.exe /S /IBE /D=C:\Tint Guide\Beauty Guide
    Установка Beauty Guide и плагины - setup.exe /S /IBEA /D=C:\Tint Guide\Beauty Guide
    Установка Brightness Guide - setup.exe /S /IBR /D=C:\Tint Guide\Brightness Guide
    Распаковка Beauty Guide - setup.exe /S /PBE /D=C:\Tint Guide\Beauty Guide
    Распаковка Brightness Guide - setup.exe /S /PBR /D=C:\Tint Guide\Brightness Guide
    Помогите пожалуйста. PACiQIe.jpg
     
  11. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Именно так не получится, потому что ключ тихой установки в Inno Setup "/VERYSILENT". Без скрипта сложно вам что-то посоветовать, но можете попробувать вот так:
    Код (Text):


    [Files]
    Source: "Beauty Guide\*"; DestDir: "{app}"; Check: "IBECheck"; Flags: ignoreversion recursesubdirs createallsubdirs

    [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 IBECheck: Boolean;
    begin
    Result:= InstallerCheck and BeautyCheck or CheckParam('/IBE');
    end;

     
    аналогично и для остальных так сделайте.
     
  12. Новичок

    Регистрация:
    29 авг 2014
    Сообщения:
    3
    Симпатии:
    0
    Пол:
    Мужской
    Хамик, сделал вот так:

    [Files]
    Source: "Room Arranger\*"; DestDir: "{app}"; Check: InstallerCheck or ICheck; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "Room Arranger\*"; DestDir: "{app}\Room Arranger"; Check: PortableCheck or PCheck; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "Room Arranger Portable.exe"; DestDir: "{app}"; Check: PortableCheck or PCheck; Flags: ignoreversion

    Код (Text):

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

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

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

    И ключи тихой установки:
    RoomArranger.exe /VERYSILENT /I
    RoomArranger.exe /VERYSILENT /P

    В обоих случаях происходит "установка", как "portable" сделать?
     
  13. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Вот так попробуйте:
    Код (Text):

    [Files]
    Source: "Room Arranger\*"; DestDir: "{app}"; Check: ICheck; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "Room Arranger\*"; DestDir: "{app}\Room Arranger"; Check: PCheck; Flags: ignoreversion recursesubdirs createallsubdirs
    Source: "Room Arranger Portable.exe"; DestDir: "{app}"; Check: PCheck; Flags: ignoreversion

    [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 ICheck: Boolean;
    begin
    Result:= Installer.Checked or CheckParam('/I');
    end;

    function PCheck: Boolean;
    begin
    Result:= Portable.Checked or CheckParam('/P');
    end;
     
  14. Новичок

    Регистрация:
    29 авг 2014
    Сообщения:
    3
    Симпатии:
    0
    Пол:
    Мужской
    Так уже пробовал, тоже самое. Быть может вот это мешает:

    function InstallerCheck: Boolean;
    begin
    Result := Installer.Checked
    end;
    function PortableCheck: Boolean;
    begin
    Result := Portable.Checked
    end;

    procedure CopmpClick(Sender: TObject);
    begin
    case TNewRadioButton(Sender) of
    Portable:
    begin
    PortableImage.Show;
    Icons.Checked:=False;
    Icons.Enabled:= Icons.Checked;
    Startmenu.Checked:=False;
    Startmenu.Enabled:= Startmenu.Checked;
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Portable';
    end;
    Installer:
    begin
    PortableImage.Hide;
    Icons.Checked:=True;
    Icons.Enabled:= Icons.Checked;
    Startmenu.Checked:=True;
    Startmenu.Enabled:= Startmenu.Checked;
    WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf32}')) + '{#MyAppName}';
    end;
    end;
    end;
     
  15. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    это можете удалять. А функцию CheckParam не изменять, как было у вас в предыдущем посте.
     
  16. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Подскажите, пожалуйста, как изменить данный код, чтобы можно было указать 3 вида установки при использовании ключа /P? Имеется 3 типа программы к каждой которой есть свой ключ командной строки. Как прописать чтобы для каждой программы был свой путь установки при наличии соответствующего ключа? Заранее Спасибо!
    Код (Text):
    function GetInstallDir(S: String): String;
    begin
      if CheckParam('/P') then
        Result:= ExpandConstant('{userdesktop}\{#MyAppNameB} {#P}');
      else
        Result:= ExpandConstant(S);
    end;
     
  17. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Mailchik, Здравствуйте, подскажите как добавить поддержку кириллицы в ваш код?
    Код (Text):
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={pf}\My Application
    Outputdir=.
    Uninstallable=no
    CreateUninstallRegKey=no

    [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;
    Сейчас он создает такое
    [​IMG]
    вот что ввожу
    Код (Text):
    setup.exe /VERYSILENT /D="D:\Тестовая папка"
     
  18. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    693
    Симпатии:
    1.019
    Пол:
    Мужской
    Хамик,
    Каким способом идет запуск сетапника? С помощью батника?
    Там просто другая кодировка используется. По умолчанию используется OEM (chcp 866). Для поддержки кирилицы можно сделать что-то вроде этого.
    Код (Text):
    chcp 1251
    setup.exe /VERYSILENT /D="D:\Тестовая папка"
    pause
    Либо использовать системную функцию OemToChar на строке параметра. Но тогда, переданные строки в правильной кодировке будут переведены в ахинею.
    Выбор зависит от способа запуска сетапника.
     
  19. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Shegorat, запуск идёт через командную строку(файл .cmd)
    Почему я спрашиваю за код, потому что если не указывать ключ /D то папка создается с читаемым текстом.
    Код (Text):
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={src}\Тестовая папка
    Outputdir=.
    Uninstallable=no
    CreateUninstallRegKey=no

    [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;
    Код (Text):
    setup.exe /VERYSILENT
    [​IMG]
     
    Последнее редактирование: 1 авг 2016
  20. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    693
    Симпатии:
    1.019
    Пол:
    Мужской
    Хамик
    Попробуйте так
    Код (Text):

    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={pf}\My Application
    Outputdir=.
    Uninstallable=no
    CreateUninstallRegKey=no

    [Code]
    function CharToOem(Source: AnsiString; Dest: AnsiString): Boolean; external 'CharToOemA@user32.dll stdcall';

    function GetDirFromCMD(kWord: string): string;
    var
      i, lStr: integer;
      tmp: AnsiString;
    begin
      Result := WizardDirValue;
      lStr := Length(kWord);

      for i := 0 to ParamCount do begin
      if Pos(LowerCase(kWord), LowerCase(ParamStr(i))) > 0 then begin
      SetLength(tmp, Length(ParamStr(i)));
      CharToOem(ParamStr(i), tmp);

      Result := Copy(tmp, Pos(LowerCase(kWord), LowerCase(tmp)) + lStr,
      Length(tmp) - 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;
     
    Хамик нравится это.

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