#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> <=