比较本地文本文件和在线文件
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
。
【问题讨论】:
“但它没有按预期工作” 它在做什么?有输出吗?有什么错误吗? @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 中不起作用。不确定这是错误还是设计。以上是关于比较本地文本文件和在线文件的主要内容,如果未能解决你的问题,请参考以下文章