如何通过C#方法在PowerShell中可靠获取子文件夹的正确数量
问题修复方案
核心错误原因
- 注释的
DirectoryInfo写法存在语法错误:[System.IO.DirectoryInfo]::new()创建的是实例对象,实例方法需要用.调用,而::是静态方法调用符,写法错误无法返回正确结果。 - 默认
EnumerateDirectories仅统计目标路径下第一层子文件夹,如果需要统计所有嵌套层级的子文件夹,需要补充搜索范围参数。 - 未添加异常处理逻辑:遇到权限不足的系统/隐藏文件夹时,枚举会直接中断,导致计数结果偏小。
- 冗余的
Measure-Object调用:PowerShell中可直接对枚举返回的集合取Count属性,无需额外管道计算,性能更好。
修正后可用代码
ForEach ($SubDir in ($DirObjects | Where-Object {$_.PSIsContainer})){ # 统计文件,直接取Count减少性能损耗 $NoOfex4Files = @([System.IO.Directory]::EnumerateFiles($SubDir.FullName, '*.ex4')).Count $NoOfmq4Files = @([System.IO.Directory]::EnumerateFiles($SubDir.FullName, '*.mq4')).Count # 统计子文件夹:如果仅要顶层子文件夹,把RecurseSubdirectories改为$false即可 $enumOptions = [System.IO.EnumerationOptions]@{ RecurseSubdirectories = $true IgnoreInaccessible = $true # 自动跳过无权访问的路径,避免执行中断 } $NoOfSubFolder = @([System.IO.Directory]::EnumerateDirectories($SubDir.FullName, '*', $enumOptions)).Count }
补充说明
代码中用@()包裹枚举方法的返回结果,是为了兼容结果集为空、仅1条结果的场景,避免PowerShell将返回值识别为标量导致Count属性失效。
内容的提问来源于stack exchange,提问作者Nicholas Wales
相关产品推荐
相关产品推荐

