PowerShell中List对象与数组的差异及List正确使用方法咨询
问题描述
使用[List[object]]创建集合并调用Add方法添加文件路径时,$AllConfigFiles.Count返回的是驱动器数量而非文件总数:
$Drives = Get-WmiObject -Class Win32_logicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID # 排除光驱、共享驱动器等,仅返回本地逻辑驱动器 $MisconfiguredConfigFiles = [List[object]]::new() $AllConfigFiles = [List[object]]::new() foreach ($drive in $Drives) { $ConfigFiles = dir "$drive\*.config" -Recurse $AllConfigFiles.Add($ConfigFiles.FullName) }
改用数组@()并通过+=操作符添加时,$AllConfigFiles.Count能返回正确的文件数:
$Drives = Get-WmiObject -Class Win32_logicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID # 排除光驱、共享驱动器等,仅返回本地逻辑驱动器 $MisconfiguredConfigFiles = [List[object]]::new() $AllConfigFiles = @() foreach ($drive in $Drives) { $ConfigFiles = dir "$drive\*.config" -Recurse $AllConfigFiles += $ConfigFiles.FullName }
如何继续使用List对象及其相关方法,实现正确统计文件数量的需求?
解决方案
核心问题是List<T>.Add方法仅支持添加单个元素,而$ConfigFiles.FullName返回的是包含多个文件路径的字符串数组。直接调用Add会把整个数组作为单个元素存入List,导致最终元素数量等于驱动器的数量。
要实现正确统计,只需改用List<T>的AddRange方法,它可以一次性将整个集合的所有元素加入List:
$Drives = Get-WmiObject -Class Win32_logicalDisk -Filter 'DriveType=3' | Select -ExpandProperty DeviceID # 排除光驱、共享驱动器等,仅返回本地逻辑驱动器 $MisconfiguredConfigFiles = [List[object]]::new() $AllConfigFiles = [List[object]]::new() foreach ($drive in $Drives) { $ConfigFiles = dir "$drive\*.config" -Recurse $AllConfigFiles.AddRange($ConfigFiles.FullName) }
备选方案
如果需要逐个添加元素,也可以嵌套循环遍历每个文件路径,再调用Add方法,但AddRange的执行效率更高:
foreach ($drive in $Drives) { $ConfigFiles = dir "$drive\*.config" -Recurse foreach ($filePath in $ConfigFiles.FullName) { $AllConfigFiles.Add($filePath) } }
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

