【发布时间】:2015-10-14 16:37:11
【问题描述】:
我一直在做这样的检查来检查上次修改日期:
if($file1.LastWriteTime -gt $file2.LastWriteTime) { }
我怎样才能做类似的事情,但比较文件是否相等。请注意,这些文件始终只是文本文件。
【问题讨论】:
标签: powershell
我一直在做这样的检查来检查上次修改日期:
if($file1.LastWriteTime -gt $file2.LastWriteTime) { }
我怎样才能做类似的事情,但比较文件是否相等。请注意,这些文件始终只是文本文件。
【问题讨论】:
标签: powershell
您可以将文件文本作为字符串进行比较。为此,首先将每个文件作为单个字符串获取,然后比较它们是否相等。
$filetext1=[System.IO.File]::ReadAllText("file1.txt")
$filetext2=[System.IO.File]::ReadAllText("file2.txt")
$equal = $filetext1 -ceq $filetext2 # case sensitive comparison
【讨论】:
[System.IO.Stream]::Read,我要试验一下。
StreamReader 或Get-Content -Encoding Byte -ReadCount $buffersize 上按照ReadBlock() 的思路进行思考。首先检查底层流的长度是否相同(如果它们的长度不同,则无需比较)
[System.IO.FileStream].read() 做同样的事情,这个对象也有length 属性来比较。有趣的一点是,如果需要将文件作为文本进行比较,因此流可能具有不同的长度,而文本文件将是相等的(例如:UTF8 文档及其来自另一个来源的 UTF16 转储)。这样ReadAllText() 方法在技术上应该返回 true,而ReadAllBytes() 和普通流内容比较都将返回 false。
diff 和 patch 开辟道路,甚至与此处要求的那些 Linux 命令按字节兼容 stackoverflow.com/questions/30889161 - 只需要阅读和重现差异文件格式。 (糟糕,链接错误)
使用如下,最快和最短的方式来比较所有类型的文件:
$(Get-FileHash $file1).hash -eq $(Get-FileHash $file2).hash
【讨论】:
你可以这样做
$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 哈希值也需要读取这些文件,所以这个解决方案并不比简单的比较文件内容更好。