我确实编写了一个脚本从Windows 7计算机上卸载Java:

[...]
$p2=start-process "msiexec.exe" -arg "/X $uninstall32 /qn REMOVE=ALL /norestart " -PassThru -wait -verb runAs
$p2.WaitForExit()
[...]

就像$uninstall32 = {26A24AE4-039D-4CA4-87B4-2F03217065FF}

如果我直接将这些ps1文件称为管理员,则一切进展顺利。 按照更新过程的顺序,我必须从.bat文件中调用我的(正在运行的)ps1文件。 这些以这种方式调用我的ps1文件

if exist "%programfiles%\java\jre7" (

    powershell.exe -NoProfile -Command "Set-ExecutionPolicy Bypass"
    powershell.exe -NoProfile -file %~dp0uninstalljava7.ps1
    powershell.exe -NoProfile -Command "Set-ExecutionPolicy "restricted"
)

那么erythin goin是错误的:msiexec抛出1619吗?

我不明白吗?


解决了:

对我来说,一个可行的解决方案是:

Set-StrictMode -Version 2

$uninstall32key = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
$uninstall64key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

$hklm32 = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)
$hklm64 = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)

$key32 = $hklm32.OpenSubKey($uninstall32key)
$key64 = $hklm64.OpenSubKey($uninstall64key)

$subkeys32 = $key32.GetSubKeyNames()
$subkeys64 = $key64.GetSubKeyNames()


foreach($subkey in $subkeys32)
{
    $key = $hklm32.OpenSubKey($uninstall32key+"\\"+$subkey)
    $displayName = $key.GetValue("DisplayName")

    if ($displayName -match "Java 7")
    {
        $uninstall32 =$key.GetValue("UninstallString") 
        if ($uninstall32) {
        $uninstall32 = $uninstall32 -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
        $params = @{
            "FilePath" = "$Env:SystemRoot\system32\msiexec.exe"
            "ArgumentList" = @(
                "/x"
                $uninstall32
                "/qn"
                "REMOVE=ALL"
                "/norestart"
            )
            "Verb" = "runas"
            "PassThru" = $true
            }
            $app1 = start-process @params
            $app1.WaitForExit()
        }
    }  
}

foreach($subkey in $subkeys64)
{
    $key = $hklm64.OpenSubKey($uninstall64key+"\\"+$subkey)
    $displayName = $key.GetValue("DisplayName")

    if ($displayName -match "Java 7")
    {
        $uninstall64 =$key.GetValue("UninstallString") 
        if ($uninstall64) {
        $uninstall64 = $uninstall64 -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
        $params = @{
            "FilePath" = "$Env:SystemRoot\system32\msiexec.exe"
            "ArgumentList" = @(
                "/x"
                $uninstall64
                "/qn"
                "REMOVE=ALL"
                "/norestart"
            )
            "Verb" = "runas"
            "PassThru" = $true
            }
            $app1 = start-process @params
            $app1.WaitForExit()
        }
    }  
} 

#1楼 票数:2 已采纳

尝试这种方式:

$appGUID = "{26A24AE4-039D-4CA4-87B4-2F03217065FF}"
$params = @{
  "FilePath" = "$Env:SystemRoot\system32\msiexec.exe"
  "ArgumentList" = @(
    "/x"
    $appGUID
    "/qn"
    "REMOVE=ALL"
    "/norestart"
  )
  "Verb" = "runas"
  "PassThru" = $true
}
$app = start-process @params
$app.WaitForExit()

#2楼 票数:0

另外,启动过程参数-ArgumentList(在您的示例中为Alias:-arg)接受参数的ARRAY。 传递单个字符串不能正常工作。

尝试这样:

$Args = @( "/X", "$uninstall32", "/qn", "REMOVE=ALL",  "/norestart" )
$p2=start-process "msiexec.exe" -argumentList $args -PassThru -wait -verb runAs

另外,如果“ $ Uninstall32”中的美元符号是安装程序的参数,则应在简单引号之间写上它:'$ uninstall32'

  ask by An User translate from so

未解决问题?本站智能推荐:

3回复

使用msiexec卸载应用程序时,GUID可以替代吗?

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

卸载脚本无法正常执行

这是一个非常简单的脚本,只需卸载一个应用程序。 这是我的代码: $app = Get-WmiObject -Class Win32_Product -Filter "Name = 'Alliance Suite G5'" Write-Host $app $app.Uninstall()
1回复

具有自定义Wix标志命令行arg的Powershell卸载应用

我创建了一个自定义的Wix标志命令行参数(FLAG =“ remove”),以在卸载过程中绕过一些自定义的消息框。 对于Windows批处理命令,该命令如下所示: 我想将此命令转换为可在Powershell中使用,但语法有问题。 我尝试了以下方法: Powershell似乎无
1回复

对于基于WiX的安装程序,添加/删除卸载和msiexec / x无法正常工作

对于某些基于WiX的安装程序,我面临着这种奇怪的行为。 安装后,如果我尝试使用“右键单击”菜单通过“添加删除程序”(Windows 7中的“程序和功能”)删除, 然后选择“卸载”(此默认BTW) ,则它仅显示一个进度对话框,该对话框立即退出并且程序从不卸载且保持不变。 使用时存在相同的行
1回复

使用msiexec卸载特定功能

我安装了一个测试应用程序,它有两个功能(FirstFeature和SecondFeature)。 我想从应用程序中只删除一个功能(SecondFeature)。 我尝试在命令行中使用REMOVE属性。 以下是用于删除SecondFeature的命令。 但它正在卸载整个应用程序。
1回复

msiexec.exe间歇性地无法卸载

msiexec.exe无法间歇性卸载。 仅当触发msiexec.exe静默卸载时,才会看到此行为。 卸载失败期间,我在卸载日志中看到以下错误。 但是错误日志没有帮助。 对理解此失败的可能原因有帮助吗? 提前致谢!
1回复

使用带有GUI向导的GUID的MSIEXEC卸载应用程序,但没有用户交互

我知道如何使用guid使用msiexec卸载MSI软件包: msiexec / i {ProductCode} 这将显示应用程序的卸载向导,用户必须单击“下一步”,“下一步”,“下一步” .....完成。 我希望卸载向导正常显示,但用户不应在向导上单击“下一步”。...相反,应使用
2回复

Powershell脚本-开始作业和MSIEXEC

我想知道你能帮忙吗? 我需要编写Powershell脚本来执行MSI脚本。 我还需要为该过程设置一个超时时间(因为有时会给我们MSI挂起)。 我已经看到您可以通过使用“开始作业/等待作业”过程来实现此目的 显然,以下代码目前处于严重的屠杀状态 提前致谢