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

PowerShell脚本拆分选中文件路径及文件名适配robocopy传输问题

问题分析与修复方案

核心问题点

  • 错误依赖InitialDirectory作为源路径:这个属性仅定义文件对话框初始打开的目录,用户切换到其他目录选择文件后,它不会自动更新为选中文件的实际所在目录,这就是你选D:\SOFTWARE下的文件时,源路径还是桌面路径的原因。
  • Split-Path使用了错误的对话框属性:OpenFileDialog没有File属性,正确的完整文件路径属性是FileName;你之前误用了不存在的File属性,导致Split-Path处理无效值,最终出现源路径变成目标路径、文件名显示为*.*的异常。

修正后的脚本

function Copy-FileToMachines {
    Add-Type -AssemblyName System.Windows.Forms
    $fileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
        InitialDirectory = [Environment]::GetFolderPath('Desktop')
    }

    $result = $fileBrowser.ShowDialog()

    if ($result -eq 'OK') {
        # 获取选中文件的完整路径
        $fullFilePath = $fileBrowser.FileName
        # 拆分得到源目录(文件所在的文件夹)
        $sourceDir = Split-Path $fullFilePath -Parent
        # 拆分得到文件名(或直接用$fileBrowser.SafeFileName,效果一致)
        $fileName = Split-Path $fullFilePath -Leaf

        $deviceList = @('Computer1', 'Computer2', 'Computer3')  # 目标机器列表

        foreach ($device in $deviceList) {
            try {
                # 调用robocopy,注意参数格式:源目录、目标目录、文件名
                robocopy "$sourceDir" "\\$device\c$\Temp" "$fileName" /Z /NP /R:3 /W:5 /BYTES /LOG+:"$env:TEMP\robocopy.log" | Out-Null
                Write-Host "文件已成功复制到 $device"
            }
            catch {
                Write-Host "复制文件到 $device 时出错: $_"
            }
        }
    }
}

额外说明

  • $fileBrowser.SafeFileName可以直接获取不含路径的文件名,和Split-Path $fullFilePath -Leaf效果完全一致,你可以根据习惯二选一。
  • robocopy的语法要求必须明确传入源目录、目标目录、要复制的文件名,确保这三个参数对应正确,才能避免出现通配符匹配(*.*)的问题。

内容的提问来源于stack exchange,提问作者Thomas Barry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:48:30