AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 5598
Accepted
Brian Willis
Brian Willis
Asked: 2009-05-07 19:37:41 +0800 CST2009-05-07 19:37:41 +0800 CST 2009-05-07 19:37:41 +0800 CST

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

  • 772

我有两个文本文件,想使用 Windows Powershell 找出它们之间的差异。有没有类似于 Unix diff 工具的东西可用?或者还有其他我没有考虑过的方法吗?

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

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

InputObject                                                 SideIndicator
-----------                                                 -------------
two.txt                                                     =>
one.txt                                                     <=
windows powershell
  • 10 10 个回答
  • 240664 Views

10 个回答

  • Voted
  1. Best Answer
    Brian Willis
    2009-05-07T19:51:46+08:002009-05-07T19:51:46+08:00

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

    compare-object (get-content one.txt) (get-content two.txt)
    
    • 158
  2. Alex Y.
    2011-12-13T11:15:03+08:002011-12-13T11:15:03+08:00

    一种更简单的方法是编写:

    diff (cat file1) (cat file2)
    
    • 64
  3. phord350
    2012-05-30T09:52:35+08:002012-05-30T09:52:35+08:00

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

    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。

    您可以在 powershell 中使用 DOS fc.exe。

    • 38
  4. Mikeage
    2009-05-07T19:56:51+08:002009-05-07T19:56:51+08:00

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

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

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

    • 9
  5. Marc Towersap
    2013-02-19T10:19:43+08:002013-02-19T10:19:43+08:00

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

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

    我的建议,不要使用 powershell 来查找文件中的差异。正如其他人所指出的,fc 的工作原理比 compare-object 好一点,甚至更好的是下载和使用 Mikeage 提到的 unix 模拟器等真实工具。

    • 7
  6. Andy White
    2009-05-07T20:58:46+08:002009-05-07T20:58:46+08:00

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

    • 4
  7. daf
    2016-01-29T04:54:40+08:002016-01-29T04:54:40+08:00

    正如其他人所指出的,如果您期待 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 有一些不错的功能,但有些事情不应该尝试为我做。

    • 3
  8. codemaster bob
    2019-02-02T01:02:19+08:002019-02-02T01:02:19+08:00

    fc.exe更适合文本比较,因为它设计为像 *nix diff 一样工作,即按顺序比较行,显示实际差异并尝试重新同步(如果不同部分具有不同的长度)。它还具有一些有用的控制选项(文本/二进制、区分大小写、行号、重新同步长度、不匹配缓冲区大小)并提供退出状态(-1 语法错误、0 个文件相同、1 个文件不同、2 个文件丢失)。作为一个(非常)旧的 DOS 实用程序,它确实有一些限制。最值得注意的是,它不会自动使用 Unicode,将 ASCII 字符的 0 MSB 视为行终止符,因此文件变成 1 字符行的序列(@kennycoc:使用 /U 选项指定 BOTH 文件都是 Unicode,WinXP 以上) 并且它还具有 128 个字符(128 字节 ASCII,

    compare-object 旨在确定 2 个对象在成员方面是否相同。如果对象是集合,那么它们将被视为 SETS(请参阅帮助 compare-object),即没有重复的 UNORDERED 集合。2个集合是相等的,如果它们具有相同的成员项目,而不管顺序或重复。这严重限制了它在比较文本文件的差异方面的有用性。首先,默认行为会收集差异,直到检查了整个对象(文件 = 字符串数组),从而丢失了有关差异位置的信息并模糊了哪些差异是配对的(并且没有 SET 的行号概念字符串)。使用 -synchwindow 0 将导致差异在发生时发出,但会阻止它尝试重新同步,因此如果一个文件有额外的行,那么即使文件在其他方面相同,后续行比较也会失败(直到有一个补偿另一个文件中的额外行,从而重新对齐匹配的行)。然而,powershell 非常通用,并且可以通过利用此功能来完成有用的文件比较,尽管代价是相当复杂并且对文件的内容有一些限制。如果您需要比较长(> 127 个字符)行的文本文件,并且这些行大多匹配 1:

    diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | sort | out-string -width xx
    

    其中 xx 是最长线的长度 + 9

    解释

    • (gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })获取文件的内容并将行号和文件指示符(<< 或 >>)添加到每一行(使用格式字符串运算符),然后将其传递给 diff。
    • -property { $_.substring(9) }告诉 diff 忽略前 9 个字符(即行号和文件指示符)比较每对对象(字符串)。这利用了指定计算属性(脚本块的值)而不是属性名称的能力。
    • -passthru导致 diff 输出不同的输入对象(包括行号和文件指示符)而不是不同的比较对象(不输出)。
    • sort-object然后将所有行放回顺序。
      out-string 通过指定足够大的宽度以避免截断,停止输出的默认截断以适应屏幕宽度(如 Marc Towersap 所述)。通常,此输出将被放入一个文件中,然后使用滚动编辑器(例如记事本)查看该文件。

    笔记

    行号格式 {0,6} 给出了一个右对齐、空格填充的 6 个字符的行号(用于排序)。如果文件超过 999,999 行,则只需将格式更改为更宽。这还需要更改$_.substring参数(比行号宽度多 3)和输出字符串 xx 值(最大行长 +$_.substring参数)。

    • 2
  9. saschabeaumont
    2009-05-07T20:17:39+08:002009-05-07T20:17:39+08:00

    还有Windiff,它提供了一个 GUI 差异界面(非常适合与基于 GUI 的 CVS/SVN 程序一起使用)

    • 1
  10. Josiah DeWitt
    2021-08-15T08:51:45+08:002021-08-15T08:51:45+08:00

    Powershell 充其量是尴尬的,并且是 diff -y 的可悲替代品。我来到这里寻找它如何工作,最终在记事本++中打开文件。正是我需要的

    • -1

相关问题

  • Vanilla Powershell 是否足以成为 Windows 和 DB 服务器管理员的语言?

  • 为什么添加新驱动器后我的磁盘驱动器访问速度如此之慢?

  • 在 Windows Server 2003 下使用 wscipt 从 .asp 文件运行 .exe

  • 最佳混合环境(OS X + Windows)备份?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve