У меня есть файл Inno Setup, содержащий такой код:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "https://www.example.com/"
#define MyAppExeName "Vytelle.DataService.Worker.exe"
#define MyAppAssocName MyAppName + " File"
#define MyAppAssocExt ".myp"
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId = {{72A0FB9B-516C-472D-886D-4DA0727FD72C}
AppName = {#MyAppName}
AppVersion = {#MyAppVersion}
;AppVerName = {#MyAppName} {#MyAppVersion}
AppPublisher = {#MyAppPublisher}
AppPublisherURL = {#MyAppURL}
AppSupportURL = {#MyAppURL}
AppUpdatesURL = {#MyAppURL}
DefaultDirName = {autopf}\{#MyAppName}
ChangesAssociations=yes
DisableProgramGroupPage=yes
; Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
OutputBaseFilename=mysetup
OutputDir=D:\
Compression=lzma
SolidCompression=yes
WizardStyle=modern
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "D:\vytelle.dataservice\Vytelle.DataService\Vytelle.DataService.Worker\bin\Debug\net7.0\publish\win-x64\*"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Registry]
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: ""
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: {sys}\sc.exe; Parameters: "create ByTestService start= auto binPath = """"{app}\{#MyAppExeName}"" ThisisParameter" ; Flags: runhidden
Но после установки получаю код процесса 1639 (неправильный код ошибки аргументов)
Просто хочу знать, как передать параметр с помощью команды sc create
, как вы видите в сценарии запуска кода.
У вас две проблемы:
binPath
нужно экранировать.Таким образом, ваша командная строка не будет работать даже автономно, не говоря уже о Inno Setup.
Правильный синтаксис:
"create ByTestService start= auto binPath = ""\""{app}\{#MyAppExeName}\"" ThisisParameter"""
Примечание: обратная косая черта в \""
(дважды) и три завершающие кавычки """
(первые две для замыкающей кавычки в sc
binPath
, а третья соответствует ведущей кавычке в Parameters
).
Это в конечном итоге выполняет:
sc create ByTestService start= auto binPath = "\"C:\Program Files (x86)\Accenture\Vytelle.DataService.Worker.exe\" ThisisParameter"
@HarisHussain Разве вам не хватает кавычек вокруг пути к exe в ValueData
, если путь содержит кавычки (что он делает)?
Нет, @Martin вернет точный путь с заданными параметрами, но я использую подход, полученный от вас. И я определенно ставлю большой палец вверх за правильный ответ, но мне нужно 15 репутаций, чтобы проголосовать, поэтому я только принимаю его, но обязательно сделаю это, когда получу репутацию. Спасибо
Искренне спасибо за быстрый ответ @Martin. Это действительно работает для меня. Я нашел альтернативный способ получить то же самое, зарегистрировав значение в переменной imagePath в редакторе реестра любой службы, например [Registry] --Root: HKA; Подраздел: "SYSTEM\CurrentControlSet\Services\ChiService"; Тип значения: строка; ИмяЗначения: "imagePath"; ValueData: "{приложение}\{#MyAppExeName} {код:GetParams}"