如何在PowerShell中单独访问gwmi返回值查找USB盘符实现文件复制
实现方案
优化后完整代码
# 强制将USB盘符查询结果转为数组,解决单USB设备时非数组无法索引的问题 $usbDrives = @( Get-CimInstance Win32_DiskDrive | Where-Object { $_.InterfaceType -eq "USB" } | Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition | Get-CimAssociatedInstance -ResultClassName Win32_LogicalDisk | Select-Object -ExpandProperty DeviceID ) # 统一配置路径参数,后续修改更方便 $targetCheckFile = "DesiredFolder\file2copy.txt" $sourceFolder = "DesiredFolder\*" $destFolder = "C:\NewFolder" # 遍历所有USB盘符检测目标文件 foreach ($driveLetter in $usbDrives) { $fullCheckPath = Join-Path -Path $driveLetter -ChildPath $targetCheckFile if (Test-Path -Path $fullCheckPath -PathType Leaf) { # 目标存在时执行复制,-Recurse递归复制子文件夹,-Force强制覆盖重名文件 Copy-Item -Path (Join-Path $driveLetter $sourceFolder) -Destination $destFolder -Recurse -Force Write-Host "已从盘符 $driveLetter 完成文件复制" # 仅需处理第一个匹配的USB时,取消下方注释即可退出循环 # break } }
原问题修复说明
- 数组转换:用
@()包裹盘符查询逻辑,无论插入1个还是多个USB设备,返回结果都是数组类型,解决无法用索引访问、split报错的问题 - 遍历逻辑:用
foreach遍历所有USB盘符逐一检测,完全不依赖固定盘符或固定索引,适配任意设备的USB盘符分配规则 - 路径拼接:使用
Join-Path自动处理盘符和路径的拼接,避免手动拼接字符串时的转义、解析错误 - 兼容性说明:如果需要兼容PowerShell 2.0等老旧版本,将
Get-CimInstance相关逻辑替换为你原来的gwmi查询,外层保留@()包裹即可生效。
内容的提问来源于stack exchange,提问作者Kennycampbell1
相关产品推荐
相关产品推荐

