好友
阅读权限10
听众
最后登录1970-1-1
|
HuiG
发表于 2025-12-10 21:20
50吾爱币
以下是deekseep 提供的方案 使用的是ODT工具卸载 setup.exe /configure remove-all.xml 方式
在使用过程中,有时会卸载不赶紧,控制面板中还保留 及安装目录也在
哪位大神 大侠 给出个方案~~~ 谢谢~~
以下为au3 脚本格式
; ============================================
; 全自动Office卸载工具 - 保持进度窗口版
; ============================================
#include <MsgBoxConstants.au3>
Global $g_sODTPath = @ScriptDir & "\setup.exe"
Global $g_sXMLPath = @ScriptDir & "\remove-all.xml"
Global $g_bSuccess = False
Global $g_hSplashWindow = 0 ; 用于存储进度窗口句柄
; 主程序
_Main()
Func _Main()
; 1. 初始提示
SplashTextOn("Office卸载工具", "正在准备卸载Microsoft Office..." & @CRLF & @CRLF & "请稍候...", 400, 150, -1, -1, 18)
Sleep(2000)
SplashOff()
; 2. 检查环境
If Not _CheckFiles() Then
MsgBox($MB_ICONERROR, "错误", "缺少必要文件!", 3)
Exit
EndIf
; 3. 显示卸载进度提示 (保持显示,直到卸载完成)
$g_hSplashWindow = SplashTextOn("正在卸载", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"正在执行卸载操作..." & @CRLF & "请稍候,不要操作计算机", 500, 200, -1, -1, 18)
; 4. 执行卸载
_ExecuteUninstall()
; 5. 关闭进度窗口
SplashOff()
; 6. 显示结果 (3秒自动关闭)
_ShowResult()
Exit
EndFunc
Func _ExecuteUninstall()
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"步骤 1/4: 正在终止Office进程..." & @CRLF & "请稍候,不要操作计算机")
; 步骤1: 终止进程
_KillOfficeProcesses()
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"步骤 2/4: 使用ODT工具卸载..." & @CRLF & "请稍候,不要操作计算机")
; 步骤2: 尝试ODT卸载 (Office 2013+)
$g_bSuccess = _RunODTUninstall()
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"步骤 3/4: 使用MSI方式卸载..." & @CRLF & "请稍候,不要操作计算机")
; 步骤3: 尝试MSI卸载 (Office 2007-2010)
If Not $g_bSuccess Then
$g_bSuccess = _RunMSIUninstall()
EndIf
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"步骤 4/4: 清理残留文件..." & @CRLF & "请稍候,不要操作计算机")
; 步骤4: 清理残留
_CleanResidues()
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"卸载操作已完成!" & @CRLF & "正在准备显示结果...")
Sleep(1000) ; 给用户看到完成信息
EndFunc
Func _RunODTUninstall()
; 执行ODT卸载命令
Local $iPID = Run('"' & $g_sODTPath & '" /configure "' & $g_sXMLPath & '"', @ScriptDir, @SW_HIDE)
; 等待最多300秒
Local $iTimeout = 300
While ProcessExists($iPID) And $iTimeout > 0
Sleep(1000)
$iTimeout -= 1
; 实时更新进度信息
Local $iSecondsRemaining = Int($iTimeout / 60) & "分" & Mod($iTimeout, 60) & "秒"
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"使用ODT工具卸载中..." & @CRLF & "预计剩余时间: " & $iSecondsRemaining)
WEnd
; 简单检查是否成功
If Not ProcessExists("WINWORD.EXE") And Not FileExists(@ProgramFilesDir & "\Microsoft Office\Office16\WINWORD.EXE") Then
Return True
EndIf
Return False
EndFunc
Func _RunMSIUninstall()
; 修正后的GUID数组 - 正确的AutoIt语法
Local $aOfficeGUIDs[38]
; Office 2021/2019/2016
$aOfficeGUIDs[0] = "{90160000-0011-0000-1000-0000000FF1CE}"
$aOfficeGUIDs[1] = "{90160000-0011-0000-0000-0000000FF1CE}"
$aOfficeGUIDs[2] = "{90160000-0016-0409-1000-0000000FF1CE}"
; Office 2016 Retail
$aOfficeGUIDs[3] = "{90160000-007E-0409-0000-0000000FF1CE}"
; Office 2013
$aOfficeGUIDs[4] = "{90150000-0011-0000-0000-0000000FF1CE}"
$aOfficeGUIDs[5] = "{90150000-008B-0409-0000-0000000FF1CE}"
; Office 2010
$aOfficeGUIDs[6] = "{90140000-0011-0000-0000-0000000FF1CE}"
$aOfficeGUIDs[7] = "{90140000-0013-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[8] = "{90140000-0015-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[9] = "{90140000-0016-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[10] = "{90140000-0017-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[11] = "{90140000-0018-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[12] = "{90140000-0019-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[13] = "{90140000-001A-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[14] = "{90140000-001B-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[15] = "{90140000-001F-0409-0000-0000000FF1CE}"
; Office 2007
$aOfficeGUIDs[16] = "{90120000-0011-0000-0000-0000000FF1CE}"
$aOfficeGUIDs[17] = "{90120000-0012-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[18] = "{90120000-0013-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[19] = "{90120000-0014-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[20] = "{90120000-0015-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[21] = "{90120000-0016-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[22] = "{90120000-0017-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[23] = "{90120000-0018-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[24] = "{90120000-0019-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[25] = "{90120000-001A-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[26] = "{90120000-001B-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[27] = "{90120000-002A-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[28] = "{90120000-002B-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[29] = "{90120000-002C-0409-0000-0000000FF1CE}"
$aOfficeGUIDs[30] = "{90120000-002D-0409-0000-0000000FF1CE}"
; Office 365
$aOfficeGUIDs[31] = "{90160000-007E-0000-1000-0000000FF1CE}"
$aOfficeGUIDs[32] = "{90160000-008C-0000-1000-0000000FF1CE}"
$aOfficeGUIDs[33] = "{90160000-00C1-0000-1000-0000000FF1CE}"
; Project & Visio
$aOfficeGUIDs[34] = "{90160000-1402-0000-1000-0000000FF1CE}"
$aOfficeGUIDs[35] = "{90160000-1401-0000-1000-0000000FF1CE}"
$aOfficeGUIDs[36] = "{90150000-1402-0000-1000-0000000FF1CE}"
$aOfficeGUIDs[37] = "{90150000-1401-0000-1000-0000000FF1CE}"
; 执行卸载
Local $bRemovedAny = False
Local $iTotal = UBound($aOfficeGUIDs)
For $i = 0 To $iTotal - 1
; 更新进度信息
Local $iProgress = Round(($i + 1) / $iTotal * 100, 0)
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"卸载MSI安装的Office..." & @CRLF & "进度: " & $iProgress & "% (" & $i + 1 & "/" & $iTotal & ")")
RunWait('msiexec /x ' & $aOfficeGUIDs[$i] & ' /qn /norestart', "", @SW_HIDE)
Sleep(300)
Next
Return True
EndFunc
Func _KillOfficeProcesses()
; 终止Office相关进程
Local $aProcesses = ["WINWORD.EXE", "EXCEL.EXE", "POWERPNT.EXE", "OUTLOOK.EXE", _
"MSACCESS.EXE", "ONENOTE.EXE", "MSPUB.EXE", "officeclicktorun.exe"]
Local $iCount = 0
For $sProcess In $aProcesses
If ProcessExists($sProcess) Then
RunWait(@ComSpec & ' /c taskkill /f /im "' & $sProcess & '" 2>nul', "", @SW_HIDE)
$iCount += 1
Sleep(200)
EndIf
Next
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"已终止 " & $iCount & " 个Office进程" & @CRLF & "继续下一步操作...")
Sleep(1000)
EndFunc
Func _CleanResidues()
; 清理常见残留目录
Local $aFolders = ["C:\Program Files\Microsoft Office", _
"C:\Program Files (x86)\Microsoft Office", _
"C:\ProgramData\Microsoft\Office", _
@ProgramFilesDir & "\Microsoft Office", _
@ProgramFilesDir & "\Microsoft\Office", _
@AppDataDir & "\Microsoft\Office", _
@LocalAppDataDir & "\Microsoft\Office" _
]
Local $iCleaned = 0
For $sFolder In $aFolders
If FileExists($sFolder) Then
DirRemove($sFolder, 1)
$iCleaned += 1
Sleep(500)
EndIf
Next
; 更新进度信息
ControlSetText($g_hSplashWindow, "", "Static1", "正在卸载Microsoft Office组件..." & @CRLF & @CRLF & _
"已清理 " & $iCleaned & " 个残留目录" & @CRLF & "卸载操作即将完成...")
EndFunc
Func _CheckFiles()
; 检查必要文件
If Not FileExists($g_sODTPath) Then
; 尝试创建基本XML文件
If Not FileExists($g_sXMLPath) Then
Local $hFile = FileOpen($g_sXMLPath, 2 + 128) ; 2=写入模式, 128=UTF8编码
FileWrite($hFile, '<?xml version="1.0" encoding="UTF-8"?>' & @CRLF)
FileWrite($hFile, '<Configuration>' & @CRLF)
FileWrite($hFile, ' <Remove All="TRUE" />' & @CRLF)
FileWrite($hFile, ' <Display Level="None" AcceptEULA="TRUE" />' & @CRLF)
FileWrite($hFile, '</Configuration>')
FileClose($hFile)
EndIf
Return False
EndIf
Return True
EndFunc
Func _ShowResult()
; 显示结果 (3秒自动关闭)
Local $sMessage
If $g_bSuccess Then
$sMessage = "✅ Office卸载完成!" & @CRLF & @CRLF & _
"Microsoft Office 已成功从计算机中移除" & @CRLF & @CRLF & _
"窗口将在3秒后自动关闭"
Else
$sMessage = "⚠️ 卸载操作已完成" & @CRLF & @CRLF & _
"Office主要组件已移除" & @CRLF & _
"可能仍有少量残留文件" & @CRLF & @CRLF & _
"窗口将在3秒后自动关闭"
EndIf
SplashTextOn("卸载完成", $sMessage, 500, 220, -1, -1, 18)
Sleep(5000) ; 3秒后自动关闭
SplashOff()
EndFunc
; 不再需要的函数
; Func _AutoCloseSplash()
; SplashOff()
; AdlibUnRegister("_AutoCloseSplash")
; EndFunc |
|