Командлет Compare-Object не будет работать с " - PullRequest
1 голос
/ 27 апреля 2020

Я создаю другой веб-сервер "web2", который должен иметь ту же конфигурацию, что и веб-сервер "web1"

Поэтому после установки некоторого программного обеспечения мне нужно отредактировать файл "web.config" на "web2" сервер, соответствующий серверу «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 строк

all differences are in red boxes

Затем я попытался сравнить оба файла с помощью командлета «Compare-Object» но я не получаю точную информацию:

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

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

Странная часть заключается в том, что если я просто заменю "<! - -" на "<! - - a", вывод изменится на: </p>

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 не может определить, есть ли в обычном файле дополнительные символы "- ->" или "<! - -" </p>

Как вы можете видеть на следующем рисунке, я сделал строку выбора и в файле web1.txt показана строка 11, но в файле web2.txt строка 11 не показана, поэтому эти файлы не совпадают.

Compare-Object AND Select-String

Спасибо !!!

1 Ответ

2 голосов
/ 27 апреля 2020

Похоже, что объект сравнения сортирует строки перед тем, как сравнивать их. Похоже, у вас есть две лишние пустые строки в первом файле. В противном случае, если строки отсортированы, они совпадают. Минимальный воспроизводимый пример:

file1. xml:



<top>

  <inner1>
  </inner1>

  <!--
  <inner2>
  </inner2>
  -->
</top>

file2. xml:

<top>
  <!--
  <inner1>
  </inner1>
  -->

  <inner2>
  </inner2>

</top>
compare-object (cat file1.xml) (cat file2.xml) 


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

cat file1.xml | sort




  -->
  <!--
  </inner1>
  </inner2>
  <inner1>
  <inner2>
</top>
<top>


cat file2.xml | sort


  -->
  <!--
  </inner1>
  </inner2>
  <inner1>
  <inner2>
</top>
<top>

Пример окна синхронизации:

file1

line1
line2
line3
line4

file2

line3
line4

Похоже, он перестает искать равные в этом окне syn c:

compare-object (cat file1) (cat file2) -SyncWindow 1

InputObject SideIndicator
----------- -------------
line3       =>
line1       <=
line2       <=
line3       <=

compare-object (cat file1) (cat file2)

InputObject SideIndicator
----------- -------------
line1       <=
line2       <=

Вот старая запись в блоге, где по умолчанию было 5: http://fatbeards.blogspot.com/2009/01/compare-object-syncwindow-parameter.html

...