调用命令和 msiexec

Posted

技术标签:

【中文标题】调用命令和 msiexec【英文标题】:Invoke-command and 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提示 这不是同一个问题,这篇文章有在我的本地机器上工作的修复程序,但我在远程机器上遇到了 的问题。请在发帖前阅读整个问题。 将日志记录添加到命令 (/l*v "$env:TEMP\uninst.log") 并查看它的内容。 【参考方案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
 

【讨论】:

以上是关于调用命令和 msiexec的主要内容,如果未能解决你的问题,请参考以下文章

linux的系统调用和shell命令式一回事吗?请解释下

strace命令_Linux strace 命令用法详解:跟踪系统调用和信号

linux C中调用shell命令和运行shell脚本

Perl调用外部命令(其他脚本系统命令)的方法和区别

Java - 调用 Shell 命令和脚本

调用命令和 msiexec