如何将两条PowerShell ForEach-Object命令的输出合并到同一文件?
合并PowerShell文件版本信息与备用数据流(ADS)输出到同一文件
核心实现思路
只遍历一次目标文件夹,同时获取每个文件的版本信息和备用数据流,避免两次遍历浪费资源,然后将两类信息组合输出到同一文件。
文本格式输出(可读性优先)
适合直接查看,每个文件的信息用分隔块展示:
$outputPath = 'C:\temp\bin_combined.txt' $targetDir = 'C:\<somefolder>\bin\' # 清空目标文件(如果已存在) if (Test-Path $outputPath) { Remove-Item $outputPath } Get-ChildItem -Path $targetDir -File | ForEach-Object { # 获取文件版本信息 $versionInfo = $_.VersionInfo # 获取非默认的备用数据流 $adsStreams = Get-Item $_.FullName -Stream * | Where-Object { $_.Stream -ne ':$Data' } | Select-Object -ExpandProperty Stream # 写入文件基础信息 Add-Content -Path $outputPath -Value "=== 文件: $($_.FullName) ===" Add-Content -Path $outputPath -Value "文件名: $($_.Name)" Add-Content -Path $outputPath -Value "文件版本: $($versionInfo.FileVersion)" Add-Content -Path $outputPath -Value "产品版本: $($versionInfo.ProductVersion)" # 写入ADS信息 if ($adsStreams) { Add-Content -Path $outputPath -Value "备用数据流(ADS):" $adsStreams | ForEach-Object { Add-Content -Path $outputPath -Value " - $_" } } else { Add-Content -Path $outputPath -Value "备用数据流(ADS): 无" } # 分隔线区分不同文件 Add-Content -Path $outputPath -Value "------------------------`n" }
CSV格式输出(适合数据分析)
如果需要用Excel等工具进一步处理,用CSV格式更方便,ADS会作为单独一列展示:
$outputPath = 'C:\temp\bin_combined.csv' $targetDir = 'C:\<somefolder>\bin\' Get-ChildItem -Path $targetDir -File | ForEach-Object { $versionInfo = $_.VersionInfo $adsStreams = Get-Item $_.FullName -Stream * | Where-Object { $_.Stream -ne ':$Data' } | Select-Object -ExpandProperty Stream # 把多个ADS转为逗号分隔的字符串 $adsList = $adsStreams -join ', ' # 构造自定义对象,方便导出CSV [PSCustomObject]@{ 完整路径 = $_.FullName 文件名 = $_.Name 文件版本 = $versionInfo.FileVersion 产品版本 = $versionInfo.ProductVersion 备用数据流 = if ($adsList) { $adsList } else { "无" } } } | Export-Csv -Path $outputPath -Encoding UTF8 -NoTypeInformation
内容的提问来源于stack exchange,提问作者sbagnato
相关产品推荐
相关产品推荐

