吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1629|回复: 5
收起左侧

[资源求助] 全自动无人值守 彻底卸载office全版本 工具及代码

[复制链接]
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 = "&#9989; Office卸载完成!" & @CRLF & @CRLF & _
                   "Microsoft Office 已成功从计算机中移除" & @CRLF & @CRLF & _
                   "窗口将在3秒后自动关闭"
    Else
        $sMessage = "&#9888;&#65039; 卸载操作已完成" & @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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zjl3480 发表于 2025-12-10 22:05
微软官方有专门的卸载工具,但是得看office版本一一对应
zjl3480 发表于 2025-12-10 22:08
enjoylun 发表于 2025-12-10 22:10
BayMaxen 发表于 2025-12-10 23:27
可以用“Office Tool Plus”这个工具,安装、卸载、调整功能,都很好用。
用这个卸载,亲测没什么残留,效果很好,不影响新装office。也能卸载新系统自带的msi版本office。
这个是网站:https://otp.landian.vip/zh-cn/download.html
 楼主| HuiG 发表于 2025-12-11 11:05
感谢以上提供的信息 这些软件都有  因公司想搞自动化、让域用户自行能卸载及安装OFFICE ,所以就用到AU3 来实现自动化。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-9-19 06:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表