如何将PowerShell数组结果存入foreach集合并遍历所有文件?
问题原因与解决方案
核心问题:数组被错误转换为字符串
你在构建$Dirs时使用双引号包裹数组变量:
$Dirs = "$Working_Dir1","$Working_Dir2","$Working_Dir3"
由于$Working_Dir1、$Working_Dir2、$Working_Dir3都是数组类型(Get-ChildItem | ForEach-Object {$_.FullName}会返回多个文件路径的数组),双引号会将数组强制转换为单个字符串(元素间用空格分隔)。这导致$Dirs实际是包含3个大字符串的数组,而非所有文件路径的集合,遍历自然只会处理这3个元素,而非每个单独的文件。
修复方案
方案1:直接合并数组(推荐)
去掉双引号,将三个数组合并为一个包含所有文件路径的单个数组:
$Dirs = $Working_Dir1 + $Working_Dir2 + $Working_Dir3
这样$Dirs里的每个元素都是单独的文件路径,遍历就能逐个处理所有文件。
方案2:保留数组嵌套并展开遍历
如果需要保留原数组分组结构,遍历的时候要嵌套处理:
$Dirs = $Working_Dir1, $Working_Dir2, $Working_Dir3 $EntitySiteList = @() try { foreach($group in $Dirs){ foreach($Name in $group){ Write-Host "$Name" Write-Host "will do other stuff here once I figure this out" } } } catch { Write-Host "Encountered the following error : $($Error[0])" exit 1 }
额外优化建议
- 用
Get-ChildItem -Directory替代Where { $_.PSIsContainer },更符合PowerShell最佳实践:
$Latest_Dir = Get-ChildItem "$Working_Dir1" -Directory | Sort CreationTime -Descending | Select -First 1
- 获取最新目录时,直接使用
$Latest_Dir.FullName拼接路径,避免对象隐式转换问题;同时用-File参数替代Where { !$_.PSIsContainer }:
$Working_Dir1 = Get-ChildItem "$Working_Dir1\$($Latest_Dir.FullName)" -File | ForEach-Object {$_.FullName}
内容的提问来源于stack exchange,提问作者chrtak
相关产品推荐
相关产品推荐

