Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 使用msiexec卸载应用程序时,是否有GUID的替代方案?_Powershell_Installation_Uninstallation_Windows Installer - Fatal编程技术网

Powershell 使用msiexec卸载应用程序时,是否有GUID的替代方案?

Powershell 使用msiexec卸载应用程序时,是否有GUID的替代方案?,powershell,installation,uninstallation,windows-installer,Powershell,Installation,Uninstallation,Windows Installer,在运行包含msiexec的卸载脚本时,我们当前使用GUID来标识应用程序。我遇到的问题是每次安装最新版本的应用程序时GUID都会更改,因此我想知道是否有其他方法可以识别使用msiexec运行的应用程序 首先:对于应用程序的新版本,产品GUID发生更改是正常的,不过也可以在不更改产品GUID的情况下升级某些应用程序(称为-而不是更改产品GUID)。同一产品的不同版本之间保持稳定的是升级代码(它定义了一系列相关产品)。ProductCode唯一标识产品(在特定版本中) 这里列出了一些卸载选项: 我想

在运行包含msiexec的卸载脚本时,我们当前使用GUID来标识应用程序。我遇到的问题是每次安装最新版本的应用程序时GUID都会更改,因此我想知道是否有其他方法可以识别使用msiexec运行的应用程序

首先:对于应用程序的新版本,产品GUID发生更改是正常的,不过也可以在不更改产品GUID的情况下升级某些应用程序(称为-而不是更改产品GUID)。同一产品的不同版本之间保持稳定的是升级代码(它定义了一系列相关产品)。ProductCode唯一标识产品(在特定版本中)

这里列出了一些卸载选项:

我想您可以使用MSI文件名,如第3节所示,或者如果产品名保持稳定,您可以将其与自动化一起使用,以查找正确的产品GUID来卸载相关产品。我将在稍后对此进行测试并更新答案


更新:通过“产品名称”卸载产品的示例VBScript(假设它在各个版本中保持不变,这是正常的,但无法保证-这取决于产品)

在“添加/删除程序”中查找产品名称,或使用此答案底部链接的微型VBScript导出一个包含所有已安装软件包信息的小文本文件

“出错时继续下一步”用于抑制错误
常量msuilevelnone=2
常量msuilevelfull=5
Const msisInstallState缺席=2
设置installer=CreateObject(“WindowsInstaller.installer”)
Set products=installer.ProductsEx(“,”,7)
installer.UILevel=msuilevelfull'使用完整GUI运行(如果在MSI中可用)
“installer.UILevel=msuilevelnone”将以静默方式运行卸载,并使用管理员权限运行脚本
'从用户处获取产品名称
productname=InputBox(“请输入要卸载的MSI软件包的产品名称:”)
如果productname=vbCancel或Trim(productname)=“”,则
WScript.Quit(0)
如果结束
'迭代框上的所有MSI包
对于产品中的每个产品
currentproduct=product.InstallProperty(“产品名称”)
如果LCase(currentproduct)=LCase(productname),则
installer.ConfigureProduct.productcode,0,2'MSInstallState缺席
MsgBox“为:¤tproduct运行卸载”
退出“最终产品迭代”,假设只需要卸载一个产品
如果结束
下一个
设置安装程序=无
MsgBox“已完成”


更新:您可以使用VBScript创建产品代码和产品名称的快速列表,如本答案底部所述:。我认为,这个特定的VBScript尽可能简单。

首先:对于新版本的应用程序,产品GUID更改是正常的,尽管也可以在不更改产品GUID的情况下升级某些应用程序(称为-而不是更改产品GUID)。同一产品的不同版本之间保持稳定的是升级代码(它定义了一系列相关产品)。ProductCode唯一标识产品(在特定版本中)

这里列出了一些卸载选项:

我想您可以使用MSI文件名,如第3节所示,或者如果产品名保持稳定,您可以将其与自动化一起使用,以查找正确的产品GUID来卸载相关产品。我将在稍后对此进行测试并更新答案


更新:通过“产品名称”卸载产品的示例VBScript(假设它在各个版本中保持不变,这是正常的,但无法保证-这取决于产品)

在“添加/删除程序”中查找产品名称,或使用此答案底部链接的微型VBScript导出一个包含所有已安装软件包信息的小文本文件

“出错时继续下一步”用于抑制错误
常量msuilevelnone=2
常量msuilevelfull=5
Const msisInstallState缺席=2
设置installer=CreateObject(“WindowsInstaller.installer”)
Set products=installer.ProductsEx(“,”,7)
installer.UILevel=msuilevelfull'使用完整GUI运行(如果在MSI中可用)
“installer.UILevel=msuilevelnone”将以静默方式运行卸载,并使用管理员权限运行脚本
'从用户处获取产品名称
productname=InputBox(“请输入要卸载的MSI软件包的产品名称:”)
如果productname=vbCancel或Trim(productname)=“”,则
WScript.Quit(0)
如果结束
'迭代框上的所有MSI包
对于产品中的每个产品
currentproduct=product.InstallProperty(“产品名称”)
如果LCase(currentproduct)=LCase(productname),则
installer.ConfigureProduct.productcode,0,2'MSInstallState缺席
MsgBox“为:¤tproduct运行卸载”
退出“最终产品迭代”,假设只需要卸载一个产品
如果结束
下一个
设置安装程序=无
MsgBox“已完成”


更新:您可以使用VBScript创建产品代码和产品名称的快速列表,如本答案底部所述:。我认为,这个特定的VBScript尽可能简单。

在这种情况下,人们绕过各种ProductCode值的通常方法是从更稳定的升级代码开始

给定升级代码,可以使用MsiEnumRelatedProducts(或脚本或MSI interop等效工具)返回产品代码。这样的代码通常不需要更改