2015-12-12 4 views
1

Я пишу функцию, которая будет устанавливать необходимый компонент для моего устройства, которое построено на PowerShell. Если определенная версия PowerShell не найдена, я хочу, чтобы установщик помог пользователю установить ее. Проблема, с которой я сталкиваюсь, заключается в том, как правильно вызвать автономный установщик для установки. Вот код, у меня есть, что общая функция (я использую InnoSetup Dependency Installer):Inno Setup - Как установить Windows Install Offline Installer

function SmartExec(product : TProduct; var resultcode : Integer): boolean; 
begin 
    if (LowerCase(Copy(product.File, Length(product.File) - 2, 3)) = 'exe') then begin 
     Result := Exec(product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); 
    end else begin 
     Result := ShellExec('', product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); 
    end; 
end; 

Я попытался с помощью следующих действий:

function SmartExec(product : TProduct; var resultcode : Integer): boolean; 
begin 
    if (LowerCase(Copy(product.File, Length(product.File) - 2, 3)) = 'exe') then begin 
     Result := Exec(product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); 
    end else if (LowerCase(Copy(product.File, Length(product.File) - 2, 3)) = 'msu') then begin 
     Result := ShellExec('', 'wusa.exe ' + product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); 
    end else begin 
     Result := ShellExec('', product.File, product.Parameters, '', SW_SHOWNORMAL, ewWaitUntilTerminated, resultcode); 
    end; 
end; 

Когда я компилирую и протестировать программу установки , я поздоровался с:

enter image description here

Я передаю /quiet /norestart как параметры файла MSU, которые отлично выполняются из командной строки.

Установочный файл загружается в %tmp% для текущего пользователя, и я вижу файл.

Любая помощь или комментарии?

ответ

1

Расширение .msu связано с wusa.exe, поэтому существующая ветка ShellExec('', product.File, ...) должна выполнить эту работу. Вам не нужно добавлять конкретную ветку msu.


Во всяком случае, специфическая отрасль может помочь с отладкой, так что стоит попробовать.

Второй параметр ShellExec function является FileName, в то время как вы проходите в wusa.exe xxx.msu, что не является допустимым именем файла.

Это должно работать:

Result := ShellExec('', 'wusa.exe', product.File + ' ' + product.Parameters, ...); 

Хотя с помощью ShellExec запустить исполняемый файл является излишеством, используйте обычный Exec function вместо:

Result := Exec('wusa.exe', product.File + ' ' + product.Parameters, ...); 

Когда Exec возвращается False, ResultCode - это код ошибки Windows, объясняющий, почему выполнение не выполнено. Вы получаете код 3, что такое ERROR_PATH_NOT_FOUND (Система не может найти указанный путь.).

Так что, похоже, что путь, который вы используете (product.File), недействителен.

Убедитесь, что вы прошли полный путь до .msu, а не только от имени файла.

Попробуйте выполнить регистрацию пути до вызова Exec и проверьте, существует ли файл.Вы можете использовать:

Log(Format('Path is [%s], Exists = %d', [product.File, Integer(FileExists(product.File))])); 
+0

Хотя я согласен, я нужен отдельный еще, если филиал, чтобы определить, является ли расширение файла МГУ, мой инсталлятор загрузить файл, по-видимому, выполнить, но сразу в комплекте с окончательной «перезагрузки необходимого ". Я никогда не вижу wusa.exe в запуске Process Explorer, поэтому я добавил второй оператор 'else if'. Является ли 'resultcode' будет переменной, к которой я могу получить прямой доступ, или вместо этого посмотрим на' Result'? –

+0

Nevermind. Я вижу, что 'resultcode' - это переменная, возвращаемая после завершения' Exec' или 'ShellExec'. Я добавил 'msgbox' сразу после операторов if, а' resultcode' - '3'. Кажется, я не могу понять, что означает «3», иначе, чем что-то не получилось. –

+0

3 является 'ERROR_PATH_NOT_FOUND'. См. Мой отредактированный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^