题 如何在Windows Powershell中区分两个文本文件?


我有两个文本文件,想要使用Windows Powershell找到它们之间的差异。是否有类似于Unix diff工具的东西?或者还有另外一种我没有考虑过的方法吗?

我已经尝试过compare-object,但是得到了这个神秘的输出:

PS C:\> compare-object one.txt two.txt

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=

74
2018-05-07 03:37






答案:


自己搞清楚了。因为Powershell使用.net对象而不是文本,所以需要使用get-content来公开文本文件的内容。因此,为了执行我在问题中尝试做的事情,请使用:

compare-object (get-content one.txt) (get-content two.txt)

80
2018-05-07 03:51



当我尝试比较两个文件时,我感到非常惊讶:一个未排序的数字数组,以及排序后的相同数字数组。尽管文件非常不同,但没有输出。显然,compare-object不考虑顺序。 - cgmb
@cgmb - 你可以使用 -SyncWindow 0 为了解决这个问题,我相信,虽然我不确定它是否最近才被引入。但是,它并不是特别聪明。 - James Ruskin


或者你可以使用DOS fc 像这样的命令(这显示了两个文件的输出,因此您必须扫描差异):

fc.exe filea.txt fileb.txt > diff.txt

fc 是Format-Custom cmdlet的别名,因此请务必输入命令 fc.exe。请注意,许多DOS实用程序不处理UTF-8编码。

您还可以生成CMD流程并运行 fc 在其中。

start cmd "/c  ""fc filea.txt fileb.txt >diff.txt"""

这指示PowerShell使用引号中的参数启动'cmd'程序的进程。在引号中,是运行命令并终止的'/ c'cmd选项。在进程中由cmd运行的实际命令是 fc filea.txt fileb.txt 将输出重定向到文件 diff.txt

你可以使用DOS fc.exe 来自powershell。


27
2018-05-29 17:52



+1用于带出DOS ^ _ ^ - Jeff Bridgman
“fc”对我不起作用,我没有意识到我必须将其指定为“fc.exe”以区别于Format-Custom。正是我在寻找什么。谢谢。 - Xonatron
也许我是一个完整的庸人,但这对我来说似乎更有用。它很好地解决了我的问题。 - AJ.


一种更简单的方法是写:

diff (cat file1) (cat file2)

23
2017-12-12 19:15



Diff和cat只是PowerShell中Compare-Object和Get-Content的别名。这是一回事。 - Shawn Melton
尽管这与接受的答案相同,但我更喜欢使用这种语法 - Elijah W. Gagne


diff on * nix不是shell的一部分,而是一个单独的应用程序。

你有什么理由不能在PowerShell下使用diff.exe吗?

您可以从UnxUtils包下载一个版本(http://unxutils.sourceforge.net/


7
2018-05-07 03:56



由于现在包含PowerShell,因此无需下载和安装任何内容。 - Bratch
我刚结束使用 git diff,因为我已经安装了它。也不 fc.exe 也不 Compare-Object 产生了我预期的输出。 - Raziel


如果你希望它的行为类似于unix diff,那么compare-object(又名diff别名)是可悲的。我尝试了diff(gc file1)(gc file2),如果一行太长,我看不到实际的差异,更重要的是,我无法分辨差异所在的行号。

当我尝试添加-passthru时,我现在可以看到差异,但我丢失了差异所在的文件,我仍然没有得到行号。

我的建议是,不要使用powershell来查找文件中的差异。正如其他人所说,fc工作,并且比compare-object工作得更好,甚至更好的是下载和使用像Mikeage提到的unix模拟器这样的真实工具。


3
2018-02-18 18:19





的WinMerge 是另一个很好的基于GUI的差异工具。


2
2018-05-07 04:58



这就是我过去的做法,这是一个手动过程,我想用一个小脚本替换。 - Bratch


正如其他人所指出的那样,如果你期望unix-y diff输出,那么使用powershell diff别名会让你失望。首先,你必须抓住它实际读取文件(使用gc / get-content)。另一方面,差异指标位于右侧,远离内容 - 这是一个可读性的噩梦。

任何寻找合理输出的人的解决方案是

  1. 得到一个真正的差异(例如从GnuWin32)
  2. 编辑%USERPROFILE%\ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1
  3. 添加线

    remove-item alias:diff -force
    

-force参数是必需的,因为Powershell对这个特定的内置别名非常珍贵。如果有人有兴趣安装GnuWin32,我还在powershell配置文件中包含以下内容:

remove-item alias:rm
remove-item alias:mv
remove-item alias:cp

主要是因为Powershell不理解一起运行和输入的参数,例如“rm -Force -Recurse”比“rm -rf”要多得多。

Powershell有一些不错的功能,但有一些东西它应该不试图为我做。


2
2018-01-28 12:54