Объект сравнения PowerShell, приводит к переполнению контекста

#powershell

#powershell

Вопрос:

Я использую Compare-Object в PowerShell для сравнения двух XML-файлов. Он адекватно отображает различия между ними, используя <= и => . Моя проблема в том, что я хочу увидеть разницу в контексте. Поскольку это XML, одна строка, один узел — это другое, но я не знаю, где это находится в общем документе. Если бы я мог взять, скажем, 5 строк до и 3 строки после него, это дало бы мне достаточно информации, чтобы понять, что это такое в контексте. Есть идеи?

Ответ №1:

 You can start from something like this:

$a = gc a.xml
$b = gc b.xml

if ($a.Length -ne $b.Length)
    { "File lenght is different" }
    else
    {
    for ( $i= 0; $i -le $a.Length; $i  )    
        {
            If ( $a[$i] -notmatch $b[$i] ) 
            {
             #for more context change the range i.e.: -2..2       
             -1..1 | % { "Line number {0}: value in file a is {1} - value in file b {2}" -f ($i $_),$a[$i $_], $b[$i $_] }
                " "
            }  
        }
    }
 

Комментарии:

1. Хммм…. Я попробую это сделать. Я шел по этому пути, но подумал, что если в $ a не хватает одной или двух строк, то после этого все не будет совпадать, верно? Однако я не знаю, как compare-object обрабатывает это.

2. Да, я удалил строку, а весь остальной документ не соответствовал. Хммм.. Я мог бы перебирать каждую коллекцию независимо, сначала ища соответствующие теги, а затем содержимое.

3. Вычеркните это, мне нужно обработать его как XML-файл, запросить и найти различия. Я не думаю, что сравнение обычного текста сократит его (что, если элемент данных выйдет из строя?). Обращение с ним как с объектом данных должно разрешить множество неизвестных. Спасибо за помощь

4. @DavidLozzi Да, если вы можете сравнить xml как xml-объект, это более точно. Но если в файле есть только какая-то небольшая разница в какой-то строке, мой код может отлично работать, ИМХО 😉

Ответ №2:

Compare-Object поставляется с IncludeEqual параметром, который может дать то, что вы ищете:

 [xml]$aa = "<this>
 <they>1</they>
 <they>2></they>
 </this>"
[xml]$bb = "<this>
 <they>1</they>
 <they>2</they>
 </this>"
Compare-Object $aa.this.they $bb.this.they -IncludeEqual
 

Результат

 InputObject SideIndicator
----------- -------------
1           ==
2           =>
2>          <=