比较本地文本文件和在线文件

Posted

技术标签:

【中文标题】比较本地文本文件和在线文件【英文标题】:Compare local text file with online file 【发布时间】:2019-11-20 01:58:30 【问题描述】:

我想通过PowerShell,两个文件的内容是一样的。

我知道我必须使用Compare-Object cmdlet 来比较两个文件,我发现我可以通过Invoke-WebRequest cmdlet (https://www.quora.com/How-do-I-download-URL-content-using-Get-Content-in-PowerShell-Script) 获取在线文件的内容。但它没有按预期工作。它只是输出在线版本的文件内容。

$item1 = cat $path
$item2 = Invoke-WebRequest -Uri $URL | select -ExpandProperty Content

# No working as expected
Compare-Object -ReferenceObject $item1 -DifferenceObject $item2 

更新

经过调试发现,使用Get-Content(cat)时返回值的类型是System.Array,而使用Invoke-WebRequest时返回值的类型是String

PS C:\> $item1.GetType() IsPublic IsSerial 名称 BaseType -------- -------- ---- -------- 真真对象[] System.Array PS C:\> $item2.GetType() IsPublic IsSerial 名称 BaseType -------- -------- ---- -------- True True 字符串 System.Object

【问题讨论】:

“但它没有按预期工作” 它在做什么?有输出吗?有什么错误吗? @boxdog 我已经稍微更新了描述 您的方法不会带来令人满意的结果。比较对象实际上仅有助于比较两个对象的属性,即一个对象是否具有另一个对象没有的属性,并且它检查两个对象是否具有相同名称的属性,如果其值不同。如果您想查看文件之间的确切差异,最好使用 diff 或 git diff 之类的工具。但是,如果您只想知道文件是否相同,则可以下载两者并运行Get-FileHash 来比较它们的校验和。如果它们相同,则文件相同。 @megamorf 这是不正确的。 Compare-Object 非常适合比较 2 个字符串数组以获得不同的行。 【参考方案1】:

Invoke-WebRequest 将所请求网页的内容作为单个字符串返回。在换行符处拆分字符串,您将能够将其与文本文件中的数据进行比较(Get-Content 默认生成一个字符串数组)。

Compare-Object -ReferenceObject $item1 -DifferenceObject ($item2 -split '\r?\n')

【讨论】:

你是对的,我试过你的代码,它不工作,更新一点,它现在工作。 powershell Compare-Object -ReferenceObject $item1 -DifferenceObject ($item2 -split '\r\n') 但是,取决于endline,需要使这个脚本适用于“LF”和“CRLF” 我发现“-split”中的正则表达式使用有点奇怪,“(”或“)”不能在''里面使用,必须改成:Compare-Object -ReferenceObject $item1 -DifferenceObject ($item2 -split '\r?\n')跨度> @KevinXiong (?<=...) 是一个积极的后视断言。但显然它不像我预期的那样工作(它似乎忽略了 CR 字符)。不知道为什么。修改了我的答案。 我知道正则表达式中的后向断言,但它在 powershell 中不起作用。不确定这是错误还是设计。

以上是关于比较本地文本文件和在线文件的主要内容,如果未能解决你的问题,请参考以下文章

比较两个文本文件 - 并将差异保存到新文件

在线文本差异对比

Scrapy学习第八课

Scrapy学习第八课

SecureFX怎么打开本地文件框

如何从在线文件 .text 中获取文本