Windows 10下PowerShell固定/取消固定任务栏脚本失效求助
解决Windows 10下PowerShell批量固定/取消固定任务栏程序的问题
我太懂这种无奈了——Win7里跑的好好的脚本,升级Win10后直接哑火,毕竟微软悄悄改了任务栏固定的底层逻辑。下面给你一套能在Win10正常工作的方案,完美支持批量操作:
问题根源
Win7里咱们能直接通过Shell.Application找到名为Pin to Tas&kbar的操作指令,但Win10不仅改了这个指令的显示名称(中文/英文系统还不一样),连COM对象调用的兼容性也有调整,32位PowerShell甚至可能找不到64位程序的操作选项。
可用脚本实现
1. 单个程序固定到任务栏
function Pin-ToTaskbar { param( [Parameter(Mandatory=$true)] [string]$FilePath ) # 先校验文件是否存在 if (-not (Test-Path $FilePath)) { Write-Error "目标文件不存在: $FilePath" return } # 初始化Shell对象 $shell = New-Object -ComObject Shell.Application $folder = $shell.Namespace((Split-Path $FilePath)) $item = $folder.ParseName((Split-Path $FilePath -Leaf)) # 匹配Win10的固定指令(兼容中英文系统) $verb = $item.Verbs() | Where-Object { $_.Name -eq '固定到任务栏' -or $_.Name -eq 'Pin to taskbar' } if ($verb) { $verb.DoIt() Write-Host "已成功固定: $FilePath" } else { # 备用方案:直接创建任务栏快捷方式(批量操作更稳定) $shortcutDir = "$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar" $shortcutPath = Join-Path $shortcutDir "$(Split-Path $FilePath -Leaf).lnk" if (-not (Test-Path $shortcutPath)) { $wshShell = New-Object -ComObject WScript.Shell $shortcut = $wshShell.CreateShortcut($shortcutPath) $shortcut.TargetPath = $FilePath $shortcut.Save() Write-Host "通过快捷方式完成固定: $FilePath" } } # 释放COM对象避免内存泄漏 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null [System.GC]::Collect() } # 调用示例 Pin-ToTaskbar -FilePath "C:\Program Files\Internet Explorer\iexplore.exe"
2. 单个程序取消固定任务栏
function Unpin-FromTaskbar { param( [Parameter(Mandatory=$true)] [string]$FilePath ) $shell = New-Object -ComObject Shell.Application $folder = $shell.Namespace((Split-Path $FilePath)) $item = $folder.ParseName((Split-Path $FilePath -Leaf)) # 匹配Win10的取消固定指令(兼容中英文系统) $verb = $item.Verbs() | Where-Object { $_.Name -eq '从任务栏取消固定' -or $_.Name -eq 'Unpin from taskbar' } if ($verb) { $verb.DoIt() Write-Host "已成功取消固定: $FilePath" } else { # 备用方案:直接删除任务栏快捷方式 $shortcutPath = "$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\$(Split-Path $FilePath -Leaf).lnk" if (Test-Path $shortcutPath) { Remove-Item $shortcutPath -Force Write-Host "通过删除快捷方式完成取消固定: $FilePath" } } [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null [System.GC]::Collect() } # 调用示例 Unpin-FromTaskbar -FilePath "C:\Program Files\Internet Explorer\iexplore.exe"
3. 批量处理示例
如果要一次性处理多个程序,直接把路径放进数组循环调用就行:
# 批量固定的程序路径列表 $appsToPin = @( "C:\Program Files\Internet Explorer\iexplore.exe", "C:\Windows\notepad.exe", "C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE" ) foreach ($app in $appsToPin) { Pin-ToTaskbar -FilePath $app }
注意事项
- 尽量用当前用户身份运行PowerShell,管理员权限可能会导致操作失效
- 脚本已经兼容中英文系统的指令名称,不用手动修改
- 快捷方式方案比COM对象调用更稳定,适合批量操作场景
内容的提问来源于stack exchange,提问作者Lisbon
相关产品推荐
相关产品推荐

