如何在PowerShell中通过folder.copyHere()批量复制OpenDialog多选文件
用PowerShell调用Folder.CopyHere批量复制并显示Windows默认传输界面
嘿,这个问题我刚好踩过坑!你遇到的核心问题是:Folder.CopyHere()不接受普通的字符串路径数组,它需要的是Shell对象的Item集合(也就是Shell32.ShellItem类型的数组),而不是纯文本路径。下面给你一套完整的解决方案,完美实现批量复制+Windows原生传输界面:
步骤1:多选源文件并获取路径
首先用OpenFileDialog多选文件,拿到字符串格式的文件路径数组:
# 加载Windows Forms程序集 Add-Type -AssemblyName System.Windows.Forms # 创建文件选择对话框,开启多选 $filePicker = New-Object System.Windows.Forms.OpenFileDialog $filePicker.Multiselect = $true $filePicker.Title = "请选择要复制的文件" if ($filePicker.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $sourceFilePaths = $filePicker.FileNames # 这是字符串数组 } else { Write-Host "未选择任何文件,程序退出" exit }
步骤2:选择目标文件夹
用FolderBrowserDialog获取目标文件夹路径:
# 创建文件夹选择对话框 $folderPicker = New-Object System.Windows.Forms.FolderBrowserDialog $folderPicker.Description = "请选择目标文件夹" if ($folderPicker.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $targetFolderPath = $folderPicker.SelectedPath } else { Write-Host "未选择目标文件夹,程序退出" exit }
步骤3:把字符串路径转为Shell Item数组(关键!)
这一步是解决问题的核心——我们需要把每个文件路径转换成Shell能识别的Item对象:
# 创建Shell.Application对象 $shell = New-Object -ComObject Shell.Application # 初始化Shell Item数组 $shellItems = @() # 遍历每个源文件,逐个转换为Shell Item foreach ($filePath in $sourceFilePaths) { # 获取文件所在的父文件夹路径 $parentFolder = Split-Path -Path $filePath -Parent # 获取父文件夹的Shell对象 $parentShellFolder = $shell.Namespace((Resolve-Path $parentFolder).Path) # 获取当前文件的Shell Item并加入数组 $fileName = Split-Path -Path $filePath -Leaf $shellItems += $parentShellFolder.ParseName($fileName) }
注意:如果你的源文件来自不同的文件夹,上面的代码也能正常工作——因为每个文件都会单独获取自己所在文件夹的Shell对象,再提取对应的Item。
步骤4:调用CopyHere批量复制,显示原生进度界面
最后把Shell Item数组传给CopyHere,同时设置参数让它显示Windows默认的传输进度窗口:
# 获取目标文件夹的Shell对象 $targetShellFolder = $shell.Namespace((Resolve-Path $targetFolderPath).Path) # 调用CopyHere,传入Shell Item数组,同时指定显示进度窗口 # 参数说明:16=显示进度对话框;4=不弹出替换确认提示(可根据需求调整) $targetShellFolder.CopyHere($shellItems, 16)
可选参数调整
CopyHere的第二个参数可以组合多个选项,常见的有:
16: 显示进度对话框(必选,这就是你要的原生传输界面)4: 不显示替换确认对话框(如果需要让用户确认替换,可以去掉这个值)256: 不显示错误对话框512: 复制时不显示进度对话框的文件名列表
你可以根据需求相加组合,比如要显示进度+替换确认,就用16;要进度+自动替换,就用16+4=20。
这样操作后,你就能看到和Windows资源管理器一模一样的批量复制进度窗口,而不是逐个文件弹出窗口啦!
内容的提问来源于stack exchange,提问作者runCMD
相关产品推荐
相关产品推荐

