С msiexec, в чем разница между этими разными способами, чтобы обратиться к установщику? - PullRequest
0 голосов
/ 27 сентября 2019

У меня простая проблема.Я нашел только два способа запуска моего msi-файла, и ни один из них не сработает.

Обратите особое внимание на использование ' и ".

ПростоПоместите, я хочу способ сделать это:

$Basics = "$PSScriptRoot"
Start-Process msiexec.exe -Wait -ArgumentList "/i $Basics\Installer_.64 bit_.msi /passive /norestart"

Однако строка, передаваемая -ArgumentList, недействительна, и я не уверен, почему.Я сделал много попыток, как вы можете видеть ниже, пытаясь понять это правильно.
$Basics на данный момент является просто копией $PSScriptRoot, но я хочу иметь отдельную переменную на случай, если яизмените его в будущем.
/passive /norestart удалено для целей тестирования.

Примечание. Это не имя файла установщика.Это сделано только для того, чтобы содержать все странные символы (., _, ), которые есть у некоторых установщиков, которые я пытаюсь запустить с этим.В основном наихудший сценарий.

Кроме того, заранее извините, что это много читается, я не совсем уверен, как лучше отформатировать его.Идите вперед и отредактируйте, если вы знаете лучший способ.

Попытки:

Не в порядке, организованном, какой это была попытка.Моя первая попытка была "/i '$Basics\Installer_.64 bit_.msi'"

Start-Process msiexec.exe -Wait -ArgumentList "/i $Basics\Installer_.64 bit_.msi"

^ Результат: открывается общее окно справки установщика Windows.

Start-Process msiexec.exe -Wait -ArgumentList "/i '$Basics\Installer_.64 bit_.msi'"

^ Результат: открывается общее окно справки установщика Windows.

Start-Process msiexec.exe -Wait -ArgumentList '/i $Basics\Installer_.64 bit_.msi'

^ Результат: «Не удалось открыть этот установочный пакет. Убедитесь, что пакет существует и вы можете получить к нему доступ, или обратитесь к поставщику приложения, чтобы убедиться, что это действительный пакет установщика Windows.»

Start-Process msiexec.exe -Wait -ArgumentList '/i "$Basics\Installer_.64 bit_.msi"'

^ Результат: «Не удалось открыть этот установочный пакет. Убедитесь, что пакет существует и вы можете получить к нему доступ, или обратитесь к поставщику приложения, чтобы убедиться, что это действительный пакет установщика Windows.»

Start-Process msiexec.exe -Wait -ArgumentList "/i Installer_.64 bit_.msi"

^ Результат: Работы ;Однако это неприемлемо, поскольку мне нужно иметь возможность поместить переменную в каталог.

Start-Process msiexec.exe -Wait -ArgumentList '/i "C:\Users\Administrator\Downloads\flashdrive\redist\Install (x86 Office)\Installer_.64 bit_.msi"'

^ Результат: Работает ;Однако это неприемлемо, так как мне нужно иметь возможность поместить переменную в каталог.

Start-Process msiexec.exe -Wait -ArgumentList "/i C:\Users\Administrator\Downloads\flashdrive\redist\Install (x86 Office)\Installer_.64 bit_.msi"

^ Результат: открывает общее окно справки установщика Windows.

Start-Process msiexec.exe -Wait -ArgumentList "/i .\Installer_.64 bit_.msi"

^Результат: «Не удалось открыть этот установочный пакет. Убедитесь, что пакет существует и к нему можно получить доступ, или обратитесь к поставщику приложения, чтобы убедиться, что это действительный пакет установщика Windows.»

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Модуль PowerShell : В настоящее время имеется модуль PowerShell для установщика Windows , предоставленный Хитом Стюартом из Microsoft.Я не проверял это много, просто тест дыма.Ниже приведен другой вариант использования MSI API напрямую через COM.


Повторное цитирование : я видел, как кто-то много писал о PowerShell и уходилпоследовательности.Это выглядит довольно сложно: Установка значений публичных свойств в командной строке - были и другие посты.

Альтернативы? : Возможно, вы можетесовершать MSI API COM звонки? У меня есть старый ответ на различные способы удаления пакетов MSI .Я посмотрю, смогу ли я выкопать пример PowerShell, тем временем вот версия VBScript, использующая MSI API COM calls:

Set installer = CreateObject("WindowsInstaller.Installer")
installer.InstallProduct "C:\Product.msi", "REBOOT=ReallySuppress"

Также есть WMI - который я никогда не использую. См. Раздел 10 здесь .


Ссылка :

0 голосов
/ 27 сентября 2019

Powershell обрабатывает все, что находится в одинарных кавычках, как буквальную строку.Ваши переменные не будут расширены, если вы используете одинарные кавычки.Поэтому вам нужно использовать двойные кавычки, если вы хотите использовать расширение переменных.
Проблема с вашим примером с двойными кавычками заключается в том, что powershell интерпретирует все символы до пробела как одну переменную.И поскольку «$ Basics \ Installer_.64 bit_.msi» не та переменная, которую вы хотите, это тоже не сработает.Вы можете поместить имя переменной в фигурные скобки ({}), чтобы отделить ее от остальной части строки.Вот пример, который будет работать:

Start-Process msiexec.exe -Wait -ArgumentList "/i ${Basics}\Installer_.64 bit_.msi"

Другой вариант - использовать строку формата :

'/i {0}\Installer_.64 bit_.msi' -f $Basics

Этот оператор дает вам многобольше свободы, и вы можете сделать очень сложное форматирование строки с ним.Еще одним дополнительным преимуществом является то, что таким образом вы можете использовать одинарные кавычки.Это гарантирует, что расширение не произойдет.Например, если ваши msi-файлы имеют в названии знаки доллара, первый пример не будет работать, так как powershell попытается расширить переменные.

...