【问题标题】:Invoke-command and msiexec调用命令和 msiexec
【发布时间】:2014-04-11 01:08:09
【问题描述】:

我正在尝试使用Invoke-Command cmdlet 删除远程计算机上的应用程序,但它不起作用。

这是我的脚本:

  Invoke-Command -ComputerName "Computername" -Verbose -ScriptBlock {
  msiexec.exe /x '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}' /qn /passive
  }

在这种情况下是否有任何可靠、可行的替代方案?

【问题讨论】:

  • 它会给你一个错误吗?如果是这样,错误是什么?
  • 没有错误,我只是得到powershell提示
  • 这不是同一个问题,这篇文章有在我的本地机器上工作的修复程序,但我在远程机器上遇到了调用命令和 msiexec 的问题。请在发帖前阅读整个问题。
  • 将日志记录添加到命令 (/l*v "$env:TEMP\uninst.log") 并查看它的内容。

标签: powershell uninstallation invoke-command


【解决方案1】:

这不使用 Invoke-Command 或 MSIExec,但它是一种功能性卸载方法,用于使用 WMI 删除远程计算机上的应用程序,用于使用 WMI 注册的任何内容(应该是通过 msiexec 安装的任何内容)。

(Get-WmiObject -Class Win32_product -ComputerName ComputerName -Filter {IdentifyingNumber LIKE '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}'}).uninstall()

此外,如果您有几台计算机可以执行此操作,则可以将其放入 ForEach 循环中。如果您在 WMI 中列出了 Name、IdentifyingNumber 和 Version,则可以使用以下上下文加快速度(使用 AT&T Connect Participant Application v9.0.82):

$App="IdentifyingNumber=`"`{1F3A6960-8470-4C84-820C-EBFFAF4DA580`}`",Name=`"AT&T Connect Participant Application v9.0.82`",version=`"9.0.82`""
([WMI]\\ComputerName\root\cimv2:Win32_Product.$App).Uninstall()

是的,$App 字符串被可怕地转义了,但这是由于 WMI 要求字符串格式化为大括号和双引号的方式,等等。这对于单个卸载并不完全有用,因为它需要您预先获取所有信息并格式化密钥字符串。但是,如果您要从 30 台机器上删除一个软件,那就更好了。您只需从我的第一个命令中删除 .Uninstall() 方法即可获取所有这些信息,所以...

Get-WmiObject -Class Win32_product -ComputerName RemoteComputer -Filter {IdentifyingNumber LIKE '{1F3A6960-8470-4C84-820C-EBFFAF4DA580}'}

会吐出类似的东西:

IdentifyingNumber : {1F3A6960-8470-4C84-820C-EBFFAF4DA580}
Name              : AT&T Connect Participant Application v9.0.82
Vendor            : AT&T Inc.
Version           : 9.0.82
Caption           : AT&T Connect Participant Application v9.0.82

也可以通过将过滤器更改为类似 `{Name LIKE '%AT&T Connect%'} 的方式与名称一起使用,甚至部分名称也可以使用,或者您可以查询 WMI 以列出所有注册的应用程序,方法是将 -完全过滤掉,尽管您可能希望将其通过管道传输到 Format-Table 以使其可读。我用过:

gwmi -class win32_product -computername RemoteComputer|ft IdentifyingNumber,Name,Version

可以在link 找到有关此内容的更多信息的好读物

【讨论】:

  • 哇,我想我在你发布的时候找到了这个解决方案:-)
【解决方案2】:

这是我想出的解决方案

$myses = New-PSSession -ComputerName "Computer" 
Invoke-Command -Session $myses -ScriptBlock {
#finds all instances of Java installed
$find_sep = gwmi win32_product -filter "Name LIKE '%Java%'" | select -ExpandProperty IdentifyingNumber
foreach($i in $find_sep){
msiexec.exe /x $i /qn /passive /l*v! c:\uninst.log
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多