PowerShell对比文本文件导出差异行至新文件的新手求助
作为PowerShell新手,用Compare-Object没得到预期结果很正常——默认它会显示双向差异,而且输出的是对象而非纯文本行,咱们一步步来解决这个问题:
实现步骤与代码
核心思路:读取两个文件内容 → 对比找出仅在File 1.txt中存在的行 → 提取纯文本内容 → 写入diff.txt
1. 读取文件内容
先把两个文件的内容读到变量里,方便后续操作:
# 读取File 1.txt的内容 $file1Lines = Get-Content -Path "File 1.txt" # 读取File 2.txt的内容 $file2Lines = Get-Content -Path "File 2.txt"
2. 对比并筛选目标行
用Compare-Object对比时,需要指定参考对象(ReferenceObject,即我们要检查的基准文件:File 1.txt)和差异对象(DifferenceObject,用来对比的文件:File 2.txt)。它会通过SideIndicator属性标记行的来源:
<=':表示该行只在ReferenceObject(File 1.txt)里存在=>:表示该行只在DifferenceObject(File 2.txt)里存在
我们只需要筛选出带<='标记的行,再提取纯文本内容:
# 对比并筛选仅在File 1.txt中存在的行 $onlyInFile1 = Compare-Object -ReferenceObject $file1Lines -DifferenceObject $file2Lines | Where-Object { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty InputObject
这里Select-Object -ExpandProperty InputObject是把对比结果里的具体行内容提取出来,避免输出对象的属性结构。
3. 写入新文件
最后把筛选出来的行写入diff.txt:
$onlyInFile1 | Out-File -Path "diff.txt" -Encoding UTF8
合并成一行简化版
如果想一步完成,也可以把命令合并:
Compare-Object -ReferenceObject (Get-Content "File 1.txt") -DifferenceObject (Get-Content "File 2.txt") | Where-Object SideIndicator -eq '<=' | Select-Object -Expand InputObject | Out-File "diff.txt" -Encoding UTF8
关键注意事项
- 如果你的文件使用特殊编码(比如GB2312),可以在
Get-Content和Out-File里加上-Encoding GB2312参数适配 - 若文件路径包含空格,一定要用引号括起来,否则PowerShell会识别错误
内容的提问来源于stack exchange,提问作者Gowtham Sarathy
相关产品推荐
相关产品推荐

