将 powershell 变量插入 msiexec 命令

inserting powershell variable into msiexec command

我们这里需要一个快速脚本来将变量名传递给命令行。很简单,但我还是很难过。我需要使用 msiexec /f 来修复 C:\windows\installer 目录中的一个 msi。然而,MSI 有一个变量名。我需要获取本地名称,然后将该名称和路径放入脚本中。然后它应该 运行 msiexec /f 具有本地 MSI 的正确路径和名称。这可能是一件简单的 quote/format 事情,也可能我完全找错门了。我在这方面比较陌生。有任何想法吗?

$localpackageName = 'localPackageName'

get-wmiobject -class win32_product -filter "name = 'smart ink'" | select-object localpackage -outvariable localPackageName

Invoke-Expression -command C:\windows\system32\MSIExec.exe /f $localPackageName

试试这个...

$localPackageName = 'localPackageName'
$command = 'C:\windows\system32\MSIExec.exe /f'

get-wmiobject -class win32_product -filter "name = 'smart ink'" | select-object localpackage -outvariable localPackageName

$packageName = $localPackageName.localpackage

$string = '{0} {1}' -f $command, $packageName
Invoke-Expression $string

如果您只是想触发 Smart Ink 的修复,则有更简单的方法。 Msiexec 允许您 pass it the guid for the ProductId 而不是指向 msi 的路径。您需要做的就是获取 guid,对于同一版本软件的所有安装,该 guid 应该保持相同。从注册表中获取 GUID 而不是调用 Win32_Product 的简单方法是:

##Read in installed packages, check for a displayname, split the key to get the GUID
$prodId = Get-ChildItem HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall |
 Where-Object {$_.GetValue('DisplayName') -match 'smart ink'} |
 Foreach-Object { $_.Name -split '\'} | Select-Object -last 1

在我的例子中,这个 returns {5ABC49B5-D0DC-428D-A082-4AEFF6490F04} 作为 Smart Ink 产品 ID。然后您可以将其传递给 msiexec。

msiexec /fa $prodId