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
相关产品推荐
相关产品推荐

