首页 > 解决方案 > 当一行有“-->”时,比较对象不起作用(xml 文件另存为 txt)

问题描述

我正在构建另一个 Web 服务器“web2”,它必须与 Web 服务器“web1”具有相同的配置

所以安装一些软件后,我需要编辑“web2”服务器上的“web.config”以匹配“web1”服务器中的那个

我是从笔记本电脑上执行此操作的,因此我将两个“web.config”文件复制到运行这些命令的笔记本电脑上:

    $w1="web1.server.local"
    $w2="web2.server.local"
    $myCred=(Get-Credential -credential "myAD\myUser")
    $file="C:\path\to\my\web.config"
    Invoke-Command -ComputerName $w1 -Credential $myCred (Get-Content $args[0]) -ArgumentList $file | Set-content web1.txt
    Invoke-Command -ComputerName $w2 -Credential $myCred (Get-Content $args[0]) -ArgumentList $file | Set-content web2.txt 

好的,现在我有来自两个服务器的“web.config”文件,命名为:web1.txt 和 web2.txt

在这里,您可以看到文件差异的图片(我使用 notepad++ 得到了这个),因为您可以看到只有 4 个差异。请注意我将文件修剪为每个文件只有 42 行

所有差异都在红色框中

然后我尝试使用“Compare-Object”cmdlet 比较这两个文件,但我没有得到准确的信息:

PS C:\> Compare-Object (Get-Content .\web1.txt) (Get-Content .\web2.txt)

InputObject SideIndicator
----------- -------------
            <=
            <=

奇怪的是,如果我只是将“<!--”替换为“<!--a”,输出将变为:

PS C:\> Compare-Object (Get-Content .\web1.txt) (Get-Content .\web2.txt)

InputObject SideIndicator
----------- -------------
      <!--  =>
      <!--a <=
            <=
            <=

然后如果我将“ - - >”更改为“ - - > b”,这就是输出:

PS C:\> Compare-Object (Get-Content .\web1.txt) (Get-Content .\web2.txt)

InputObject SideIndicator
----------- -------------
      <!--  =>
      -->   =>
      <!--a <=
      -->b  <=
            <=
            <=

我尝试检查文件的编码,在 UTF-8 中创建它们,我还删除了很多 xml 文件块,删除了很多括号(在两个文件上),但它从来没有显示出差异。

有什么我想念的吗?

为什么 Compare-Object 无法判断普通文件是否有额外的“-->”或“<!--”

如下图所示,我做了一个选择字符串,在 web1.txt 中显示了第 11 行,但 web2.txt 没有显示第 11 行,所以这些文件不一样。

比较对象和选择字符串

谢谢!!!

标签: xmlpowershelldiffxml-comments

解决方案


我不是已经回答了吗?比较对象首先对两个输入进行排序,因此除了两个额外的空行之外,两个文件最终相同。

这是同样的问题: Compare-Object cmdlet won't work with "<!--" in a txt file


推荐阅读