You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:27:22