用于卸载程序的批处理文件

时间:2013-12-31 17:58:37

标签: windows batch-file uninstall

我正在尝试通过批处理文件卸载程序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上。

2 个答案:

答案 0 :(得分:1)

根据Microsoft指南正确安装的每个程序都会在HKLM\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

答案 1 :(得分:0)

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

首先你要做的事:WMIC产品> C:\用户\ “当前用户” \桌面\ allapps.txt

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

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

获得应用程序名称后,只需将第4行中的查找放入并替换为包含我的示例的几行,并使用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秒才能执行,因为它正在查询计算机的系统,所以它看起来好像一开始什么也没做,但它会运行! ;) 祝你好运:)