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

Хамик

Старожил
Mailchik,

При нахождении ключа "/p" - из папки {src} будут копироваться все файлы в папку {app}.
Как в вашем примере указать чтобы не создавался деинсталлятор (но только чтобы при наличии ключа, если ключ не указан то деинсталлятор создавался)???
Код:
#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;
 

Shegorat

Lord of Madness
Администратор
Хамик
Код:
[Setup]
Uninstallable=not CheckParam('/p')
Не проверял, но должно сработать
 

Хамик

Старожил
Shegorat, Спасибо! Сработало, но почему-то создается пустая папка с названием программы в Program Files... Как исправить этот дефект?
немного дополнил свой скрипт
Код:
#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;
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
Хамик, Думаю как-то так
Код:
#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;
 

Хамик

Старожил
Shegorat, Не знаете, что нужно изменить в коде чтобы работало наоборот ( тоесть при наличии ключа действие не происходило)?
Код:
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;
 

Shegorat

Lord of Madness
Администратор
Хамик, Ну либо при вызове использовать not
Код:
not CheckParam('/myparam')
Либо
Код:
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;
 

Хамик

Старожил
Shegorat, А можно как-то сделать чтобы этот код допускал и нижний регистр?
 

Хамик

Старожил
Shegorat, Здравствуйте, обнаружился не большой баг в коде. Если установить стационарную версию, а потом распаковать портативную, то портативная распаковуется в ту же папку что и стационарная установилась. Подскажите как исправить? Просто при тихой установке папка по умолчанию должна быть для обычной версии Program Files, а для портативной Рабочий стол. Проверил наоборот, сначала установил потрабл а потом стационарную, то все норм.....каждая версия в свою папку установилась.
Код:
[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;
 

Вложения

  • 3.2 KB Просмотры: 22
Последнее редактирование:

sergey3695

Ветеран
Модератор
Хамик,
Код:
[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;
 

AlekseyPopovv

Мимокрокодил
Ребята, у меня есть "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
 

Хамик

Старожил
К примеру хотелось бы сделать так:
Именно так не получится, потому что ключ тихой установки в Inno Setup "/VERYSILENT". Без скрипта сложно вам что-то посоветовать, но можете попробувать вот так:
Код:
[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;
аналогично и для остальных так сделайте.
 

AlekseyPopovv

Мимокрокодил
Хамик, сделал вот так:

[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

Код:
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" сделать?
 

Хамик

Старожил
В обоих случаях происходит "установка", как "portable" сделать?
Вот так попробуйте:
Код:
[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;
 

AlekseyPopovv

Мимокрокодил
Так уже пробовал, тоже самое. Быть может вот это мешает:

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;
 

Хамик

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

Хамик

Старожил
Mailchik, Здравствуйте, подскажите как добавить поддержку кириллицы в ваш код?
Код:
[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;
Сейчас он создает такое

вот что ввожу
Код:
setup.exe /VERYSILENT /D="D:\Тестовая папка"
 

Shegorat

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

Хамик

Старожил
Shegorat, запуск идёт через командную строку(файл .cmd)
Почему я спрашиваю за код, потому что если не указывать ключ /D то папка создается с читаемым текстом.
Код:
[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;
Код:
setup.exe /VERYSILENT
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
Хамик
Попробуйте так
Код:
[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;
 
Сверху