PowerShell调用Get-ChildItem扫描共享盘返回无目录名文件记录问题
PowerShell扫描共享盘缺失DirectoryName属性问题修复方案
问题根因
- 路径匹配逻辑错误:
$sourcepath*的写法会匹配所有名称前缀和$sourcepath完全一致的目录,而非仅扫描$sourcepath下的内容。如果$sourcepath末尾未携带反斜杠,匹配范围会完全超出预期,返回的文件自然不在目标共享盘目录下,你也无法检索到。 - 权限不足:
Get-ChildItem默认会静默跳过无权限访问的文件/目录,这类对象返回时会缺失DirectoryName等核心属性,且你手动检索时因为权限不足也无法找到对应文件。 - 隐藏/系统文件未展示:你手动检索时如果未开启「显示隐藏文件、受保护的操作系统文件」的选项,也会看不到扫描到的隐藏属性文件。
- 未过滤目录对象:原脚本没有加
-File参数,会把目录对象也返回,目录对象的属性结构和文件不同,也可能出现属性缺失的情况。
修复后的代码
# 确保源路径末尾携带反斜杠,避免路径匹配错误 if (-not $sourcepath.EndsWith('\')) { $sourcepath += '\' } $properties = @( @{ Name = 'File Size (MB)' Expression = {[math]::Round(($_.Length / 1MB),2)} } 'DirectoryName' 'Name' 'FullName' # 新增完整路径字段,直接定位文件位置 'CreationTime' 'LastWriteTime' @{ Name = 'Age' Expression = {[math]::Round(([datetime]::Now - $_.LastWriteTime).TotalDays /365,2)} } ) # 修正Get-ChildItem参数,加-File只扫文件,加错误变量记录无权限路径 $target_files = Get-ChildItem -Path $sourcepath -Recurse -File -ErrorAction SilentlyContinue -ErrorVariable scanErrors | Select-Object $properties | Export-Csv $destinationpath\${destinationfilename}.csv -NoTypeInformation # 可选:导出扫描错误日志,查看无权限的路径 $scanErrors | Export-Csv $destinationpath\scan_errors.csv -NoTypeInformation
验证方法
导出结果后查看FullName字段即可直接获取文件的完整路径,复制路径直接到资源管理器地址栏访问即可定位文件,如果访问报错说明是权限不足导致的属性缺失。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

