PowerShell中查询文件夹深度时Recurse参数失效问题排查
问题分析与解决办法
1. Recurse参数的使用问题
你写的-Path $nmlfpEngD*是错误的,这种写法会让Get-ChildItem先尝试匹配\\nml-fp\EngDesignLib\下的所有直接子项(*是通配符),再对这些子项执行递归。但网络共享路径下这种写法容易出现解析异常,导致无法获取递归后的文件夹。
正确的用法是直接指定根路径,不需要加*:
$subfolders = Get-ChildItem -Path $nmlfpEngD -Directory -Recurse -Force
2. 完全无输出的原因排查
Write-Host输出格式错误:你直接输出$resultObject,PowerShell只会显示对象的哈希表格式(比如@{StringCount=X; SubfolderName=Y; Path=Z}),如果本身没拿到文件夹对象,自然看不到有效内容。改成格式化输出才能明确看到结果:Write-Host "深度:$($resultObject.StringCount) | 文件夹名:$($resultObject.SubfolderName) | 路径:$($resultObject.Path)"- 权限限制:递归访问网络共享文件夹时,可能部分子文件夹没有读取权限,导致
Get-ChildItem静默失败。可以添加错误捕获查看具体问题:$subfolders = Get-ChildItem -Path $nmlfpEngD -Directory -Recurse -Force -ErrorAction SilentlyContinue # 查看错误信息 $Error - CSV写入混淆:如果脚本多次运行,
-Append参数会累积内容,但第一次运行没有生成对象的话,CSV文件会是空的。可以先清空CSV再写入,避免旧内容干扰:# 清空现有CSV if (Test-Path $csvFilePath) { Remove-Item $csvFilePath }
3. 文件夹深度计算修正
你当前的StringCount计算的是路径拆分后的总段数,不是相对于根目录的实际深度。比如根路径\\nml-fp\EngDesignLib\拆分后是4段('', '', nml-fp, EngDesignLib),子文件夹\\nml-fp\EngDesignLib\a\b拆分后是6段,实际深度是2,所以需要减去根路径的段数:
$rootSegmentCount = $nmlfpEngD.Split('\').Count foreach ($subfolder in $subfolders) { $resultObject = [PSCustomObject]@{ Depth = $subfolder.FullName.Split('\').Count - $rootSegmentCount SubfolderName = $subfolder.Name Path = $subfolder.FullName } # 后续写入和输出代码不变 }
修正后的完整脚本
$nmlfpEngD = "\\nml-fp\EngDesignLib\" $csvFilePath = "\\nml-fp\Users\Scripts\Scripts\Aras\CSVOutput\GetSubFolders.csv" # 清空现有CSV文件,避免旧内容干扰 if (Test-Path $csvFilePath) { Remove-Item $csvFilePath -Force } # 计算根路径的段数,用来计算相对深度 $rootSegmentCount = $nmlfpEngD.Split('\').Count # 递归获取所有文件夹,同时捕获错误 $subfolders = Get-ChildItem -Path $nmlfpEngD -Directory -Recurse -Force -ErrorAction SilentlyContinue # 如果有错误,打印出来排查 if ($Error.Count -gt 0) { Write-Host "遇到以下错误:" $Error | ForEach-Object { Write-Host $_ } } foreach ($subfolder in $subfolders) { $resultObject = [PSCustomObject]@{ Depth = $subfolder.FullName.Split('\').Count - $rootSegmentCount SubfolderName = $subfolder.Name Path = $subfolder.FullName } $resultObject | Export-Csv -Path $csvFilePath -NoTypeInformation -Append Write-Host "深度:$($resultObject.Depth) | 文件夹名:$($resultObject.SubfolderName) | 路径:$($resultObject.Path)" }
内容的提问来源于stack exchange,提问作者ITBrute
相关产品推荐
相关产品推荐

