如何通过PowerShell检测文件管理器选中文件并实现复制操作
可行方案:用PowerShell检测文件资源管理器选中的文件并复制
当然有办法实现这个需求!核心思路是借助Windows的Shell.Application COM对象来读取文件资源管理器窗口里的选中项,再用PowerShell自带的复制命令完成操作。下面是具体的实现步骤和脚本:
1. 核心逻辑说明
Windows的Shell.Application对象可以访问系统中所有打开的资源管理器实例,我们可以通过它遍历窗口、识别文件夹类型的窗口,最后提取其中用户选中的文件/文件夹路径。
2. 完整PowerShell脚本
# 替换成你需要的目标文件夹路径 $targetFolder = "D:\Your\Target\Directory" # 创建Shell.Application对象 $shellApp = New-Object -ComObject Shell.Application # 获取所有打开的Shell窗口(包含资源管理器和IE等,后续会过滤) $allWindows = $shellApp.Windows() # 收集所有选中的文件/文件夹路径 $selectedPaths = @() foreach ($window in $allWindows) { # 只处理本地文件夹窗口(排除网页、网络共享等非本地路径) if ($window.LocationURL -match '^file:///') { $selectedItems = $window.Document.SelectedItems() foreach ($item in $selectedItems) { # 将Shell对象路径转换为本地可识别的路径 $selectedPaths += $item.Path } } } # 处理无选中项的情况 if ($selectedPaths.Count -eq 0) { Write-Host "未检测到任何选中的文件或文件夹,请先在资源管理器中选择内容!" exit 1 } # 执行复制操作 try { Copy-Item -Path $selectedPaths -Destination $targetFolder -Recurse -Force Write-Host "✅ 成功复制 $($selectedPaths.Count) 个项目到 $targetFolder" } catch { Write-Host "❌ 复制失败:$_" exit 1 } # 释放COM对象,避免内存泄漏 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shellApp) | Out-Null
3. 使用步骤
- 打开文件资源管理器,选中你需要复制的文件/文件夹
- 修改脚本里的
$targetFolder为你的目标存储路径 - 运行这个PowerShell脚本即可自动完成复制
4. 额外提示
- 如果目标路径是系统目录(比如
C:\Windows),需要以管理员身份运行PowerShell - 脚本会检测所有打开的资源管理器窗口中的选中项,如果多个窗口都有选中内容,会一并复制
- 若只想处理当前激活的资源管理器窗口,可以在遍历窗口时增加判断:
if ($window.Visible -and $window.Document.Folder.Self.IsFileSystem),结合前台进程识别来精准定位当前窗口
内容的提问来源于stack exchange,提问作者Laslos
相关产品推荐
相关产品推荐

