【问题标题】:Batch file to uninstall a program用于卸载程序的批处理文件
【发布时间】:2014-01-18 15:08:31
【问题描述】:

我正在尝试通过批处理文件卸载程序 EXE,但没有成功。

在注册表中找到的卸载字符串如下:

C:\PROGRA~1\Kofax\Capture\ACUnInst.exe /Workstation
C:\PROGRA~1\Kofax\Capture\UNWISE.EXE /U 
C:\PROGRA~1\Kofax\Capture\INSTALL.LOG

如果我从 CMD 或批处理运行它,它什么也不做。

如果我从 CMD 运行 C:\PROGRA~1\Kofax\Capture\UNWISE.EXE /U,它将打开一个对话框,指向 INSTALL.LOG 文件,然后继续卸载。

最后,它会要求我点击完成。

我需要保持沉默,你能给我指出正确的方向吗?这是在 XP 和 7 上。

【问题讨论】:

  • 我的帖子在不应该被编辑的时候被编辑了,注册表中的 UninstallString:C:\PROGRA~1\Kofax\Capture\ACUnInst.exe /Workstation C:\PROGRA~1\Kofax \Capture\UNWISE.EXE /UC:\PROGRA~1\Kofax\Capture\INSTALL.LOG

标签: windows batch-file uninstallation


【解决方案1】:

每个根据 Microsoft 指南正确安装自身的程序都会在HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall(用于机器安装)或HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall(用于用户配置文件安装)中创建一个注册表项。通常,程序的键是它的 GUID,或者是程序的名称。在该键中将有一个名为UninstallString 的条目。这包含要执行以卸载程序的命令。

如果您已经提前知道要卸载的内容,那么只需将其放入批处理文件中就足够简单了。但是,当您尝试自动化该过程时,它会变得很棘手。您可以使用 reg 命令从注册表中获取数据,但它会在给定键的实际值周围返回大量文本,使其难以使用。您可能想尝试使用 VBscript 或 PowerShell,因为它们有更好的选择将数据从注册表中获取到变量中。

这可能会帮助您进一步.....

How to Create a script via batch file that will uninstall a program if it was installed on windows 7 64-bit or 32-bit

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,这就是我想出的。 不过,在开始使用此方法之前,您可能想使用 CMD 在 WMIC 上查找应用程序的名称,所以......

    首先你想做:WMIC 产品 > C:\Users\"currentuser"\Desktop\allapps.txt

    我建议将命令输出到 TXT 文件,因为在 Cmd 提示符下阅读它真的很混乱,而且更容易找到您要查找的数据。

    现在您要做的是找到应用程序的实际名称...如果您查看我输入的代码,应用程序名称显示为 SkypeT,因为 Skype 的末尾有“™”,并且命令提示符可以'不要按原样解释。

    获得应用名称后,只需在第 4 行输入 find 并替换,其中几行包含我的 Skype 示例...

    您也可以创建一个名为 %APP% 的变量而不必担心,但目前它工作得很好......

    有一点要注意!我的 msi /quiet 命令不起作用,程序无法安装或卸载,所以我使用了 /passive,它可以让用户看到发生了什么。

    @Echo off
    CD %cd%
    :VerInstall
    for /f "tokens=12,*" %%a in ('wmic product list system ^| Find /I "SkypeT"') do (
    if Errorlevel = 0 ( 
    Echo Skype is installed! )
    if Errorlevel = 1 ( Echo Skype is not installed, proceding to the installation!
    Ping localhost -n 7 >nul
    goto :Reinstall )
    )
    
    :Status
    tasklist /nh /fi "IMAGENAME eq "APP.exe" | find ":"> nul
    if errorlevel = 1 goto :force
    goto :Uninstall
    
    :Force
    echo We are killing the proccess... Please do not use the application during this process!
    Ping localhost -n 7 > nul
    taskkill /F /FI "STATUS eq RUNNING" /IM APP* /T
    echo The task was killed with success! Uninstalling...
    Ping localhost -n 7 > nul
    
    :Uninstall
    cls
    for /f "tokens=12,*" %%a in ('wmic product list system ^| Find /I "SkypeT"') do (
    set %%a=%%a: =%
    msiexec.exe /x %%a /passive /norestart
    )
    
    :DoWhile
    cls
    Tasklist /fi "IMAGENAME eq msi*" /fi "STATUS eq RUNNING" | Find ":" >nul
    if errorlevel = 1 (
    echo Installation in progress
    Goto :DoWhile
    )
    echo Skype is Uninstalled
    
    :Reinstall
    msiexec.exe /i SkypeSetup.msi /passive /norestart
    
    :reinstallLoop
    
    Tasklist /fi "IMAGENAME eq msi*" /fi "STATUS eq RUNNING" | Find ":" >nul
    if errorlevel = 1 ( 
    echo Installation in progress
    goto :reinstallLoop
    )
    echo Skype is installed
    
    :end
    cls
    color 0A
    Echo Done!
    exit
    

    最后一件事。我将此用作不可见的 EXE 任务,因此用户无法与命令提示符交互并最终关闭窗口(我知道,我知道,它使整个回声变得愚蠢,但这是出于测试目的)。为此我使用 BAT 到 EXE 转换器 2.3.1,您可以将一切都放在后台运行,它会很好地工作。如果您想向用户显示进度,只需编写 START Echo "info" 并将信息替换为您想要的任何内容,它将打开另一个提示并显示您需要的信息。

    请记住,Wmic 命令有时需要长达 20 秒的时间才能执行,因为它正在查询计算机的系统,所以它可能一开始看起来什么也没做,但它会运行! ;) 祝你好运:)

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2014-01-01
      • 2012-04-17
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多