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

我有两个文本文件,并希望使用Windows Powershell查找它们之间的差异。 有什么类似的Unix差异工具可用? 或者还有另外一种我没有考虑过的方式?

我试过比较对象,但得到这个神秘的输出:

PS C:\> compare-object one.txt two.txt InputObject SideIndicator ----------- ------------- two.txt => one.txt <= 

    自己想出来。 由于Powershell使用.net对象而不是文本,所以您需要使用get-content来显示文本文件的内容。 所以要执行我想在问题中做的事情,请使用:

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

    或者你可以像这样使用DOS的fc命令(这显示了这两个文件的输出,所以你将不得不扫描的差异):

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

    fc是Format-Custom cmdlet的别名,因此请确保以fc.exe的格式input命令 。 请注意,许多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将输出redirect到diff.txt文件。

    您可以使用fc.exe的DOS fc.exe

    一个简单的方法是写:

     diff (cat file1) (cat file2) 

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

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

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

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

    比较对象(又名差异别名)是可悲的,如果你期望它的行为像一个unix差异。 我尝试了diff(gc file1)(gc file2),如果一行太长,我看不到实际的差异,更重要的是,我不能确定diff是哪一行数。

    当我尝试添加-passthru时,我现在可以看到差异,但是我失去了哪个文件的区别,而且我还是没有得到一个行号。

    我的build议,不要使用PowerShell来find文件的差异。 正如其他人指出的那样,fc工作,比compare-object更好一些,甚至更好的是下载和使用真正的工具,比如Mikeage提到的unix模拟器。

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

    任何人寻找一个理智的输出的解决scheme是

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

       remove-item alias:diff -force 

    -force参数是必需的,因为Powershell对于这个特定的内置别名是相当宝贵的。 如果有人有兴趣,安装GnuWin32,我也包括在我的PowerShell的configuration文件:

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

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

    Powershell有一些不错的function,但有些事情不应该为我做。

    还有Windiff提供了GUI差异界面(非常适合基于GUI的CVS / SVN程序)