我遇到了同样的问题,这就是我想出的。
不过,在开始使用此方法之前,您可能想使用 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 秒的时间才能执行,因为它正在查询计算机的系统,所以它可能一开始看起来什么也没做,但它会运行! ;)
祝你好运:)