是否有一种简单的方法可以使用PowerShell加入标准的“添加或删除程序”功能,以卸载现有应用程序?或者检查应用程序是否已安装?

有帮助吗?

解决方案

$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    
$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

编辑:Rob发现了另一种使用Filter参数的方法:

<*>.Name -match "Software Name" } $app.Uninstall()

编辑:Rob发现了另一种使用Filter参数的方法:

<*>

其他提示

编辑:多年来,这个答案得到了很多赞成。我想补充一些意见。我从那时起就没有使用过PowerShell,但我记得在观察一些问题时:

  1. 如果以下脚本中的匹配项数多于1,则它不起作用,您必须附加将结果限制为1的PowerShell过滤器。我相信它是 -First 1 但我不是当然。随意编辑。
  2. 如果MSI没有安装该应用程序,则它不起作用。它编写如下的原因是因为它修改了MSI以便在没有干预的情况下卸载,这在使用本机卸载字符串时并不总是默认情况。

  3. 使用WMI对象需要永远。如果您只知道要卸载的程序的名称,则速度非常快。

    $uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 编辑:多年来,这个答案得到了很多赞成。我想补充一些意见。我从那时起就没有使用过PowerShell,但我记得在观察一些问题时:

    1. 如果以下脚本中的匹配项数多于1,则它不起作用,您必须附加将结果限制为1的PowerShell过滤器。我相信它是 -First 1 但我不是当然。随意编辑。
    2. 如果MSI没有安装该应用程序,则它不起作用。它编写如下的原因是因为它修改了MSI以便在没有干预的情况下卸载,这在使用本机卸载字符串时并不总是默认情况。

    3. 使用WMI对象需要永远。如果您只知道要卸载的程序的名称,则速度非常快。

      <*>.PSPath } | ? { 编辑:多年来,这个答案得到了很多赞成。我想补充一些意见。我从那时起就没有使用过PowerShell,但我记得在观察一些问题时:

      1. 如果以下脚本中的匹配项数多于1,则它不起作用,您必须附加将结果限制为1的PowerShell过滤器。我相信它是 -First 1 但我不是当然。随意编辑。
      2. 如果MSI没有安装该应用程序,则它不起作用。它编写如下的原因是因为它修改了MSI以便在没有干预的情况下卸载,这在使用本机卸载字符串时并不总是默认情况。

      3. 使用WMI对象需要永远。如果您只知道要卸载的程序的名称,则速度非常快。

        <*> -match "SOFTWARE NAME" } | select UninstallString $uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 编辑:多年来,这个答案得到了很多赞成。我想补充一些意见。我从那时起就没有使用过PowerShell,但我记得在观察一些问题时:

        1. 如果以下脚本中的匹配项数多于1,则它不起作用,您必须附加将结果限制为1的PowerShell过滤器。我相信它是 -First 1 但我不是当然。随意编辑。
        2. 如果MSI没有安装该应用程序,则它不起作用。它编写如下的原因是因为它修改了MSI以便在没有干预的情况下卸载,这在使用本机卸载字符串时并不总是默认情况。

        3. 使用WMI对象需要永远。如果您只知道要卸载的程序的名称,则速度非常快。

          <*>.PSPath } | ? { 编辑:多年来,这个答案得到了很多赞成。我想补充一些意见。我从那时起就没有使用过PowerShell,但我记得在观察一些问题时:

          1. 如果以下脚本中的匹配项数多于1,则它不起作用,您必须附加将结果限制为1的PowerShell过滤器。我相信它是 -First 1 但我不是当然。随意编辑。
          2. 如果MSI没有安装该应用程序,则它不起作用。它编写如下的原因是因为它修改了MSI以便在没有干预的情况下卸载,这在使用本机卸载字符串时并不总是默认情况。

          3. 使用WMI对象需要永远。如果您只知道要卸载的程序的名称,则速度非常快。

            <*> -match "SOFTWARE NAME" } | select UninstallString if ($uninstall64) { $uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" $uninstall64 = $uninstall64.Trim() Write "Uninstalling..." start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait} if ($uninstall32) { $uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" $uninstall32 = $uninstall32.Trim() Write "Uninstalling..." start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait}

要修复Jeff Hillman的帖子中的第二种方法,你可以做一个:

$app = Get-WmiObject 
            -Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"

或者

$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"

要在这篇文章中添加一些内容,我需要能够从多个服务器中删除软件。我用杰夫的回答引导我:

首先我得到了服务器列表,我使用了 AD 查询,但你可以提供您想要的计算机名称数组:

$computers = @("computer1", "computer2", "computer3")

然后我循环遍历它们,将-computer参数添加到gwmi查询:

foreach($server in $computers){
    $app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
        

要在这篇文章中添加一些内容,我需要能够从多个服务器中删除软件。我用杰夫的回答引导我:

首先我得到了服务器列表,我使用了 AD 查询,但你可以提供您想要的计算机名称数组:

$computers = @("computer1", "computer2", "computer3")

然后我循环遍历它们,将-computer参数添加到gwmi查询:

<*>

我使用IdentifyingNumber属性来匹配而不是名称,只是为了确保我正在卸载正确的应用程序。

.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1" } $app.Uninstall() }

我使用IdentifyingNumber属性来匹配而不是名称,只是为了确保我正在卸载正确的应用程序。

我发现不建议使用Win32_Product类,因为它会触发修复并且不会进行查询优化。 来源

我在Sitaram Pamarthi找到了这篇文章如果你知道app guid就要卸载一个脚本。他还提供了另一个脚本来快速搜索应用程序此处

  

使用如下:。\ uninstall.ps1 -GUID   {C9E7751E-88ED-36CF-B610-71A1D262E906}

[cmdletbinding()]            

param (            

 [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
 [string]$ComputerName = $env:computername,
 [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Mandatory=$true)]
 [string]$AppGUID
)            

 try {
  $returnval = ([WMICLASS]"\\$computerName\ROOT\CIMV2:win32_process").Create("msiexec `/x$AppGUID `/norestart `/qn")
 } catch {
  write-error "Failed to trigger the uninstallation. Review the error message"
  

我发现不建议使用Win32_Product类,因为它会触发修复并且不会进行查询优化。 来源

我在Sitaram Pamarthi找到了这篇文章如果你知道app guid就要卸载一个脚本。他还提供了另一个脚本来快速搜索应用程序此处

  

使用如下:。\ uninstall.ps1 -GUID   {C9E7751E-88ED-36CF-B610-71A1D262E906}

<*> exit } switch ($($returnval.returnvalue)){ 0 { "Uninstallation command triggered successfully" } 2 { "You don't have sufficient permissions to trigger the command on $Computer" } 3 { "You don't have sufficient permissions to trigger the command on $Computer" } 8 { "An unknown error has occurred" } 9 { "Path Not Found" } 9 { "Invalid Parameter"} }
function Uninstall-App {
    Write-Output "Uninstalling $($args[0])"
    foreach($obj in Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") {
        $dname = $obj.GetValue("DisplayName")
        if ($dname -contains $args[0]) {
            $uninstString = $obj.GetValue("UninstallString")
            foreach ($line in $uninstString) {
                $found = $line -match '(\{.+\}).*'
                If ($found) {
                    $appid = $matches[1]
                    Write-Output $appid
                    start-process "msiexec.exe" -arg "/X $appid /qb" -Wait
                }
            }
        }
    }
}

这样称呼:

Uninstall-App "Autodesk Revit DB Link 2019"

我会做出自己的小小贡献。我需要从同一台计算机中删除一个包列表。这是我提出的脚本。

$packages = @("package1", "package2", "package3")
foreach($package in $packages){
  $app = Get-WmiObject -Class Win32_Product | Where-Object {
    

我会做出自己的小小贡献。我需要从同一台计算机中删除一个包列表。这是我提出的脚本。

<*>

我希望这证明是有用的。

请注意,我欠David Stetler这个剧本的功劳,因为它基于他的。

.Name -match "$package" } $app.Uninstall() }

我希望这证明是有用的。

请注意,我欠David Stetler这个剧本的功劳,因为它基于他的。

以下是使用msiexec的PowerShell脚本:

echo "Getting product code"
$ProductCode = Get-WmiObject win32_product -Filter "Name='Name of my Software in Add Remove Program Window'" | Select-Object -Expand IdentifyingNumber
echo "removing Product"
# Out-Null argument is just for keeping the power shell command window waiting for msiexec command to finish else it moves to execute the next echo command
& msiexec /x $ProductCode | Out-Null
echo "uninstallation finished"

一行代码:

get-package *notepad* |% { & 

一行代码:

<*>.Meta.Attributes["UninstallString"]}

根据杰夫希尔曼的回答:

这是一个可以添加到 profile.ps1 或在当前PowerShell会话中定义的函数:

# Uninstall a Windows program
function uninstall($programName)
{
    $app = Get-WmiObject -Class Win32_Product -Filter ("Name = '" + $programName + "'")
    if($app -ne $null)
    {
        $app.Uninstall()
    }
    else {
        echo ("Could not find program '" + $programName + "'")
    }
}

假设您要卸载 Notepad ++ 。只需将其输入PowerShell:

<代码>&GT;卸载(QUOT;记事本++&QUOT)

请注意 Get-WmiObject 可能需要一些时间,请耐心等待!

使用:

function remove-HSsoftware{
[cmdletbinding()]
param(
[parameter(Mandatory=$true,
ValuefromPipeline = $true,
HelpMessage="IdentifyingNumber can be retrieved with `"get-wmiobject -class win32_product`"")]
[ValidatePattern('{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}}')]
[string[]]$ids,
[parameter(Mandatory=$false,
            ValuefromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Computer name or IP adress to query via WMI")]
[Alias('hostname,CN,computername')]
[string[]]$computers
)
begin {}
process{
    if($computers -eq $null){
    $computers = Get-ADComputer -Filter * | Select dnshostname |%{

使用:

<*>

它尚未经过全面测试,但在PowerShell 4下运行。

我在这里看到的是运行PS1文件。让它从 AD 中检索所有系统,并尝试在所有系统上卸载多个应用程序。

我使用IdentifyingNumber搜索David Stetlers输入的软件原因。

未经测试:

  1. 不在脚本中调用函数中添加id,而是使用参数ID
  2. 启动脚本
  3. 使用超过1个计算机名称调用脚本自动从函数中检索
  4. 从管道中检索数据
  5. 使用IP地址连接系统
  6. 它没有:

    1. 如果在任何给定系统上实际找到软件,它不会提供任何信息。
    2. 它没有提供有关卸载失败或成功的任何信息。
    3. 我无法使用uninstall()。尝试我得到一个错误,告诉我调用一个值为NULL的表达式的方法是不可能的。相反,我使用了Remove-WmiObject,它似乎也是如此。

      注意:如果没有计算机名称,则会从Active Directory中的所有系统中删除该软件。

      .dnshostname} } foreach($computer in $computers){ foreach($id in $ids){ write-host "Trying to uninstall sofware with ID ", "$id", "from computer ", "$computer" $app = Get-WmiObject -class Win32_Product -Computername "$computer" -Filter "IdentifyingNumber = '$id'" $app | Remove-WmiObject } } } end{}} remove-hssoftware -ids "{8C299CF3-E529-414E-AKD8-68C23BA4CBE8}","{5A9C53A5-FF48-497D-AB86-1F6418B569B9}","{62092246-CFA2-4452-BEDB-62AC4BCE6C26}"

它尚未经过全面测试,但在PowerShell 4下运行。

我在这里看到的是运行PS1文件。让它从 AD 中检索所有系统,并尝试在所有系统上卸载多个应用程序。

我使用IdentifyingNumber搜索David Stetlers输入的软件原因。

未经测试:

  1. 不在脚本中调用函数中添加id,而是使用参数ID
  2. 启动脚本
  3. 使用超过1个计算机名称调用脚本自动从函数中检索
  4. 从管道中检索数据
  5. 使用IP地址连接系统
  6. 它没有:

    1. 如果在任何给定系统上实际找到软件,它不会提供任何信息。
    2. 它没有提供有关卸载失败或成功的任何信息。
    3. 我无法使用uninstall()。尝试我得到一个错误,告诉我调用一个值为NULL的表达式的方法是不可能的。相反,我使用了Remove-WmiObject,它似乎也是如此。

      注意:如果没有计算机名称,则会从Active Directory中的所有系统中删除该软件。

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

$uninstallPath = $unInstallPathReg[0].UninstallString
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstallPath = $uninstallPath .Trim()

32位:

$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

 [array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

$uninstallPath = $unInstallPathReg[0].UninstallString
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstallPath = $uninstallPath .Trim()

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath")

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp 

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

.PSPath } | ? {

对于我的大多数程序,本帖子中的脚本都可以完成这项工作。 但我不得不面对一个遗留的程序,我无法使用msiexec.exe或Win32_Product类删除。 (从某种原因,我得到了0号出口,但程序仍在那里)

我的解决方案是使用Win32_Process类:

nickdnk 的帮助下,此命令是获取卸载exe文件的路径:

64位:

<*>

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

-match $programName } | select UninstallString

32位:

<*>

你必须清理结果字符串:

<*>

现在当您拥有相关的程序卸载exe文件路径时,您可以使用此命令:

<*>
  

$ uninstallResult - 将有退出代码。 0是成功

以上命令也可以远程运行 - 我是使用invoke命令完成的,但我相信添加参数-computername可以正常工作

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top