Is it possible to accept custom command line parameters with Inno Setup
Я готовлю установщик с помощью Inno Setup. Но я хотел бы добавить дополнительные пользовательские (ни один из доступных параметров) параметры командной строки и хотел бы получить значение параметра, например:
setup.exe /do something
Проверить, если /do
дается, то получить значение чего-то. Является ли это возможным? Как я могу это сделать?
10 ответов
В InnoSetup 5.5.5 (и, возможно, в других версиях) просто передайте в качестве параметра все, что вы хотите, с префиксом /
c:\> myAppInstaller.exe /foo=wiggle
и в вашем myApp.iss:
[Setup]
AppName = {param:foo|waggle}
|waggle
предоставляет значение по умолчанию, если не найдено ни одного параметра. Настройка Inno не чувствительна к регистру. Это особенно хороший способ обработки параметров командной строки: они просто возникают. Хотелось бы, чтобы был такой удобный способ сообщить пользователям, о каких параметрах командной строки заботится установщик.
Кстати, это делает ответы @knguyen и @steve-dunn несколько излишними. Функции утилит делают именно то, что делает встроенный синтаксис {param: }.
В дополнение к ответу @DanLocks константа {param: ParamName | DefaultValue } задокументирована в нижней части страницы констант:
http://www.jrsoftware.org/ishelp/index.php?topic=consts
Я нашел это очень удобным для необязательного подавления страницы лицензии. Вот все, что мне нужно было добавить (используя Inno Setup 5.5.6(a)):
[code]
{ If there is a command-line parameter "skiplicense=true", don't display license page }
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := False
if PageId = wpLicense then
if ExpandConstant('{param:skiplicense|false}') = 'true' then
Result := True;
end;
Inno Setup напрямую поддерживает переключатели с синтаксисом /Name=Value
с помощью {param}
постоянный
Вы можете использовать константу непосредственно в разделах, хотя это использование довольно ограничено.
Пример:
[Registry]
Root: HKCU; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; \
ValueName: "Mode"; ValueData: "{param:Mode|DefaultMode}"
Скорее всего, вы захотите использовать переключатели в Pascal Script.
Если ваш переключатель имеет синтаксис /Name=Value
, самый простой способ прочитать его значение ExpandConstant
функция
Например:
if ExpandConstant('{param:Mode|DefaultMode}') = 'DefaultMode' then
begin
Log('Installing for default mode');
end
else
begin
Log('Installing for different mode');
end;
Если вы хотите использовать значение переключателя для переключения записей в разделах, вы можете использовать Check
параметр и вспомогательная функция, например:
[Files]
Source: "Client.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Client')
Source: "Server.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Server')
[Code]
function SwitchHasValue(Name: string; Value: string): Boolean;
begin
Result := CompareText(ExpandConstant('{param:' + Name + '}'), Value) = 0;
end;
По иронии судьбы, сложнее проверить наличие простого переключателя (без значения).
Использование может использовать функцию CmdLineParamExists
из ответа @TLama на передачу условного параметра в Inno Setup
function CmdLineParamExists(const Value: string): Boolean;
var
I: Integer;
begin
Result := False;
for I := 1 to ParamCount do
if CompareText(ParamStr(I), Value) = 0 then
begin
Result := True;
Exit;
end;
end;
Очевидно, что вы можете использовать эту функцию в Pascal Script:
if CmdLineParamExists('/DefaultMode') then
begin
Log('Installing for default mode');
end
else
begin
Log('Installing for different mode');
end;
Но вы даже можете использовать его в разделах, чаще всего с Check
параметр:
[Files]
Source: "MyProg.hlp"; DestDir: "{app}"; Check: CmdLineParamExists('/InstallHelp')
Если вы хотите проанализировать аргументы командной строки из кода inno, используйте метод, подобный этому. Просто вызовите скрипт inno из командной строки следующим образом:
c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue
Затем вы можете вызывать GetCommandLineParam следующим образом:
myVariable := GetCommandLineParam('-myParam');
{ ================================================================== }
{ Allows for standard command line parsing assuming a key/value organization }
function GetCommandlineParam (inParam: String):String;
var
LoopVar : Integer;
BreakLoop : Boolean;
begin
{ Init the variable to known values }
LoopVar :=0;
Result := '';
BreakLoop := False;
{ Loop through the passed in arry to find the parameter }
while ( (LoopVar < ParamCount) and
(not BreakLoop) ) do
begin
{ Determine if the looked for parameter is the next value }
if ( (ParamStr(LoopVar) = inParam) and
( (LoopVar+1) <= ParamCount )) then
begin
{ Set the return result equal to the next command line parameter }
Result := ParamStr(LoopVar+1);
{ Break the loop }
BreakLoop := True;
end;
{ Increment the loop variable }
LoopVar := LoopVar + 1;
end;
end;
Это функция, которую я написал, которая является улучшением ответа Стивена Данна. Вы можете использовать его как:
c:\MyInstallDirectory>MyInnoSetup.exe /myParam="parameterValue"
myVariable := GetCommandLineParam('/myParam');
{ util method, equivalent to C# string.StartsWith }
function StartsWith(SubStr, S: String): Boolean;
begin
Result:= Pos(SubStr, S) = 1;
end;
{ util method, equivalent to C# string.Replace }
function StringReplace(S, oldSubString, newSubString: String): String;
var
stringCopy: String;
begin
stringCopy := S; { Prevent modification to the original string }
StringChange(stringCopy, oldSubString, newSubString);
Result := stringCopy;
end;
{ ================================================================== }
function GetCommandlineParam(inParamName: String): String;
var
paramNameAndValue: String;
i: Integer;
begin
Result := '';
for i := 0 to ParamCount do
begin
paramNameAndValue := ParamStr(i);
if (StartsWith(inParamName, paramNameAndValue)) then
begin
Result := StringReplace(paramNameAndValue, inParamName + '=', '');
break;
end;
end;
end;
Да, это возможно, вы можете использовать ParamStr
функция в PascalScript для доступа ко всем параметрам командной строки. ParamCount
Функция выдаст вам количество параметров командной строки.
Другая возможность заключается в использовании GetCmdTail
В ответ на:
"В InnoSetup 5.5.5 (и, возможно, в других версиях) просто передайте в качестве параметра все, что вы хотите, с префиксом /" "@NickG, да, каждую константу, которую вы можете расширить с помощью функции ExpandConstant"
- Это не вариант. Попытка использовать параметр командной строки в ExpandConstant в InnoSetup 5.5.6 приводит к ошибке во время выполнения.
PS: Я бы добавил комментарий напрямую, но, видимо, мне не хватает "репутации"
Я немного изменил ответ knguyen. Теперь он нечувствителен к регистру (вы можете написать en console / myParam или /MYPARAM) и может принимать значение по умолчанию. Также я исправил случай, когда вы получаете параметр большего размера, чем ожидалось (для ex: /myParamOther="parameterValue" вместо /myParam="parameterValue". Теперь myParamOther не совпадает).
function GetCommandlineParam(inParamName: String; defaultParam: String): String;
var
paramNameAndValue: String;
i: Integer;
begin
Result := defaultParam;
for i := 0 to ParamCount do
begin
paramNameAndValue := ParamStr(i);
if (Pos(Lowercase(inParamName)+'=', AnsiLowercase(paramNameAndValue)) = 1) then
begin
Result := Copy(paramNameAndValue, Length(inParamName)+2, Length(paramNameAndValue)-Length(inParamName));
break;
end;
end;
end;
Вы можете передать параметры в ваши установочные скрипты. Установите препроцессор Inno Setup и прочтите документацию по передаче пользовательских параметров командной строки.