如何通过PowerShell实现非Win32软件的静默卸载并设置Windows开机自动执行
如何通过PowerShell实现非Win32软件的静默卸载并设置Windows开机自动执行
我太懂这种被公司强制安装的冗余软件烦到头疼的感觉了!还好你已经定位到问题——这款foobar不在Get-WmiObject -Class Win32_Product的结果里,但能在卸载注册表项找到,甚至还找到了可行的卸载命令,接下来咱们一步步搞定开机自动静默卸载的需求。
第一步:确认并整理你的卸载命令
你已经有两个可用的方向,咱们分别理清楚:
- 针对Office ClickToRun类软件(比如你提到的O365):你测试过的这个命令已经能静默卸载,直接用就行:
"C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" scenario=install scenariosubtype=uninstall sourcetype=None productstoremove=O365ProPlusRetail.16_de-de_x-none culture=de-de version.16=16.0 DisplayLevel=False forceappshutdown=true - 针对注册表Uninstall项里的软件(比如foobar):如果它的注册表项里有
UninstallString值,直接用那个值就行;如果想用msiexec,就从注册表项里找到ProductCode(就是带大括号的GUID),然后用:
这里的msiexec.exe /x {你的软件GUID} /qn/qn参数是关键,确保完全静默无界面。
第二步:编写PowerShell卸载脚本
咱们把卸载命令封装成脚本,还要确保脚本能以管理员身份运行(卸载需要权限):
- 打开记事本,粘贴下面的代码,替换成你的实际卸载命令:
# 检查是否以管理员身份运行,不是的话重新启动脚本 $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs exit } # 可选:先检查软件是否已安装,避免重复执行卸载 $foobarUninstallKey = Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\{你的foobar的GUID或注册表项名称}" -ErrorAction SilentlyContinue if ($foobarUninstallKey) { # 执行卸载命令 - 替换成你的实际命令 # 示例1:Office ClickToRun卸载 & "C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" scenario=install scenariosubtype=uninstall sourcetype=None productstoremove=O365ProPlusRetail.16_de-de_x-none culture=de-de version.16=16.0 DisplayLevel=False forceappshutdown=true # 示例2:msiexec卸载(替换GUID) # & msiexec.exe /x {12345678-ABCD-EFGH-IJKL-1234567890AB} /qn } else { Write-Host "目标软件已卸载,无需操作" exit } - 保存文件,命名为
UninstallUnwantedSoftware.ps1,比如放到C:\Scripts\文件夹(没有的话新建一个)。 - 先手动以管理员身份运行这个脚本,确认卸载正常,没有弹窗,确保静默生效。
第三步:设置开机自动执行
有两种靠谱的方法,推荐任务计划程序,因为更灵活可控:
方法一:任务计划程序(推荐,开机即运行,无需等待用户登录)
- 按Win+R,输入
taskschd.msc回车,打开任务计划程序。 - 点击左侧“任务计划程序库”,然后点击右侧“创建基本任务”。
- 给任务起个名字(比如“静默卸载冗余软件”),描述随便写,点击下一步。
- 触发器选择“当计算机启动时”,点击下一步。
- 操作选择“启动程序”,点击下一步。
- 程序或脚本里填
powershell.exe,添加参数里填:-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\UninstallUnwantedSoftware.ps1" - 勾选“不管用户是否登录都要运行”,然后勾选“使用最高权限运行”(必须,因为卸载需要管理员权限),点击下一步。
- 完成前,勾选“当单击完成时,打开此任务属性的对话框”,在弹出的属性窗口里:
- 切换到“设置”标签,取消勾选“如果任务运行超过X小时就停止”,确保卸载能完成。
- 切换到“条件”标签,取消勾选“只有在计算机使用交流电源时才启动此任务”(如果是笔记本的话)。
- 点击确定保存任务。
方法二:注册表(登录后运行,适合简单需求)
如果你更喜欢用命令行设置,打开管理员PowerShell,运行下面的命令(替换脚本路径):
New-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "UninstallUnwantedSoftware" -Value '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\UninstallUnwantedSoftware.ps1"' -PropertyType String -Force
这个方法会让脚本在用户登录系统后自动运行。
一些额外注意事项
- 执行策略问题:
-ExecutionPolicy Bypass参数是为了绕过PowerShell的执行策略限制,如果你公司有组策略限制执行策略,可能需要联系IT调整,但你有管理员权限的话一般没问题。 - 重复卸载规避:脚本里的检查步骤很重要,避免每次开机都执行卸载命令,浪费系统资源。
- 测试优先:一定要先手动运行脚本确认没问题,再设置开机自动执行,避免出现意外情况。
备注:内容来源于stack exchange,提问作者Foad




