我有两个文本文件,并希望使用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是
添加行
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程序)