PowerShell批量提取文件元数据生成XML时数据重复问题求助
PowerShell脚本修正:单文件信息独立XML输出
问题分析
原脚本存在以下核心问题导致数据重复:
- 提前在循环外批量获取所有文件的哈希、ACL、元数据,变量存储的是所有文件的集合,而非单个文件的信息
- 错误使用嵌套循环,遍历文件路径时又遍历所有输出文件名,导致每个文件对应所有输出XML
- 导出XML的时机和逻辑错误,未针对单个文件的信息独立导出
修正后的脚本
$logdir = "C:\Users\gnome\Documents" # 读取两个文件的内容,确保顺序对应 $filePaths = Get-Content -Path "C:\Users\gnome\Documents\files.txt" $outputFileNames = Get-Content -Path "C:\Users\gnome\Documents\filesv2.txt" # 同时遍历文件路径和对应的输出文件名(索引匹配) for ($i = 0; $i -lt $filePaths.Count; $i++) { $currentPath = $filePaths[$i] $currentOutputName = $outputFileNames[$i] $outputPath = Join-Path -Path $logdir -ChildPath "test1_$currentOutputName.xml" Write-Host "Processing $currentPath -> $outputPath" # 针对单个文件获取信息 $hash = Get-FileHash -Path $currentPath -Algorithm SHA256 $acl = Get-Acl -Path $currentPath | Select-Object * $metadata = Get-ChildItem -Path $currentPath | Select-Object * # 构造单个文件的信息对象 $fileInfo = @{ sha256Hash = $hash acl = $acl metadata = $metadata } # 导出为独立XML文件 $fileInfo | Export-Clixml -Path $outputPath -Force }
关键改动说明
- 按索引配对遍历:使用
for循环通过索引同时获取对应的文件路径和输出文件名,确保一一对应 - 单文件信息获取:将
Get-FileHash、Get-Acl、Get-ChildItem移到循环内部,每次仅处理当前文件的信息 - 独立导出:处理完单个文件的信息后立即导出为对应的XML,避免数据累积重复
- 路径安全处理:用
Join-Path构建输出路径,避免字符串拼接导致的路径错误 - 强制覆盖:添加
-Force参数,若输出文件已存在则直接覆盖(可根据需求移除)
内容的提问来源于stack exchange,提问作者AffectiveGnome
相关产品推荐
相关产品推荐

