【问题标题】:How can I use PowerShell to compare two text files to see if they are equal?如何使用 PowerShell 比较两个文本文件以查看它们是否相等?
【发布时间】:2015-10-14 16:37:11
【问题描述】:

我一直在做这样的检查来检查上次修改日期:

if($file1.LastWriteTime -gt $file2.LastWriteTime) { }

我怎样才能做类似的事情,但比较文件是否相等。请注意,这些文件始终只是文本文件。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以将文件文本作为字符串进行比较。为此,首先将每个文件作为单个字符串获取,然后比较它们是否相等。

    $filetext1=[System.IO.File]::ReadAllText("file1.txt")
    $filetext2=[System.IO.File]::ReadAllText("file2.txt")
    $equal = $filetext1 -ceq $filetext2 # case sensitive comparison
    

    【讨论】:

    • 根据文件大小,您可能希望避免变量赋值,并可能进行逐块比较而不是整个文件
    • 确实如此,但鉴于 OP 说文件是纯文本,它们的大小预计不会太大。 (虽然说 IIS 日志可以增长到疯狂的大小,但比较它们是否相等是毫无用处的。)我还不知道如何通过 Powershell 从文件中读取块。 (也许我应该问或谷歌)谷歌说使用[System.IO.Stream]::Read,我要试验一下。
    • StreamReaderGet-Content -Encoding Byte -ReadCount $buffersize 上按照ReadBlock() 的思路进行思考。首先检查底层流的长度是否相同(如果它们的长度不同,则无需比较)
    • 是的,可以对文件流[System.IO.FileStream].read() 做同样的事情,这个对象也有length 属性来比较。有趣的一点是,如果需要将文件作为文本进行比较,因此流可能具有不同的长度,而文本文件将是相等的(例如:UTF8 文档及其来自另一个来源的 UTF16 转储)。这样ReadAllText() 方法在技术上应该返回 true,而ReadAllBytes() 和普通流内容比较都将返回 false。
    • 这种方法还可以为在 Powershell 中创建真正的 diffpatch 开辟道路,甚至与此处要求的那些 Linux 命令按字节兼容 stackoverflow.com/questions/30889161 - 只需要阅读和重现差异文件格式。 (糟糕,链接错误)
    【解决方案2】:

    使用如下,最快和最短的方式来比较所有类型的文件:

    $(Get-FileHash $file1).hash -eq $(Get-FileHash $file2).hash
    

    【讨论】:

    • 这适用于 PowerShell 4.0 及更高版本,但不适用于 Windows 7 中的默认 PowerShell 2.0。
    【解决方案3】:

    你可以这样做

    $file1 = get-content file1 -raw
    $file2 = get-content file2 -raw
    Compare-Object $file1 $file2 -caseSensitive
    

    这将改为比较文件的内容。这适用于较小的文件。如果您正在处理大文件,请考虑改用 md5 校验和。请看下面的post 示例。

    md5 和将整个文件读入内存之间的主要区别在于,依赖于 md5 实现,不必将两个文件的全部内容都保存在内存中进行比较。

    【讨论】:

    • 不,Compare-Object 不会比较真正的相等性,如果这样使用的话。 $s1=@("a","b"); $s2=@("b","a"); compare-object $s1 $s2 返回零差异,但文件(get-content 返回字符串数组,因此这些代表文件)是不同的。获取文件的 MD5 哈希值也需要读取这些文件,所以这个解决方案并不比简单的比较文件内容更好。
    • 您对比较对象的看法是正确的,考虑到字符串数组相同,即使排序不同。感谢您澄清这一点。我更新了我的帖子并评论了更多关于 md5 场景的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多