【问题标题】:inserting powershell variable into msiexec command将 powershell 变量插入 msiexec 命令
【发布时间】:2017-01-16 21:07:38
【问题描述】:

我们这里需要一个快速脚本来将变量名传递到命令行。容易,但我还是难住了。我需要使用 msiexec /f 来修复 C:\windows\installer 目录中的 msi。然而,MSI 有一个变量名。我需要获取本地名称,然后将该名称和路径放入脚本中。然后它应该使用本地 MSI 的正确路径和名称运行 msiexec /f。这可能是一个简单的引用/格式的事情,或者我可能完全是在错误的门前吠叫。我对此比较陌生。有任何想法吗?

$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

【问题讨论】:

  • 你应该避免使用win32_product,原因见我的评论。

标签: powershell variables command windows-installer


【解决方案1】:

试试这个...

$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

【讨论】:

  • 投反对票,因为应该不惜一切代价避免使用 win32_product。它强制对所有已注册的 MSI 软件包进行一致性检查,并自动进行可以重置自定义设置的修复(我自己去过那里)。由于包的重新注册,它也很慢。您可以在查询此类后通过检查应用程序事件日志来验证这一点。
【解决方案2】:

如果您只是想触发 Smart Ink 的修复,还有更简单的方法。 Msiexec 允许您使用 pass it the guid for the ProductId 而不是 msi 的路径。您需要做的就是获取对于同一版本软件的所有安装都应保持不变的 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

在我的情况下,这将返回 {5ABC49B5-D0DC-428D-A082-4AEFF6490F04} 作为 Smart Ink 产品 ID。然后,您可以将其传递给 msiexec。

msiexec /fa $prodId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2010-10-23
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多