Compare-Object dá falsas diferenças

1

Eu tenho algum problema com o Compare-Object. Minha tarefa é obter diferença entre dois instantâneos de diretórios feitos em momentos diferentes. Primeiro instantâneo é feito assim:

ls -recurse d:\dir | export-clixml dir-20100129.xml 

Depois, recebo um segundo instantâneo e os dois:

$b = (import-clixml dir-20100130.xml) 
$a = (import-clixml dir-20100129.xml) 

Em seguida, estou tentando comparar com o Compare-Object, assim:

diff $a $b 

O que eu obtenho é em alguns lugares arquivos que foram adicionados a $ b desde $ a, mas em alguns - arquivos que estavam em ambos os instantâneos e alguns arquivos, que foram adicionados a $ b, não são fornecidos na saída Compare-Object. Intrigante, mas $ b.count - $ a.count é EXATAMENTE igual ao (diff $ a $ b) .count. Por quê é aquele?

Ok, o Compare-Object tem o parâmetro -property. Eu tento usar isso:

diff -property fullname $a $b 

E eu recebo toda a confusão das diferenças: mostra ALL os arquivos. Por exemplo, digamos $ a contém:

A.txt 
A.txt 
A.txt 

E $ b contém:

X.mp3 
X.mp3 
X.mp3 
A.txt 
A.txt 
A.txt 
A saída do

diff é algo assim:

X.mp3 => 
A.txt <= 
X.mp3 => 
A.txt <= 
X.mp3 => 
A.txt <= 
A.txt => 
A.txt => 
A.txt => 

Estranho. Acho que não entendo algo crucial sobre o Compare- Uso de objetos e manuais são escassos ... Por favor, ajude-me a obter o DIFFERENCE entre dois instantâneos de diretórios. Agradecemos antecipadamente

UPDATE: salvei dados como strings simples como essa:

> import-clixml dir-20100129.xml | % { $_.fullname } | out-file -enc utf8 a.txt

E os resultados são os mesmos. Aqui estão trechos de ambos os instantâneos (top 100 e algumas linhas, a.txt e b.txt), saída do objeto de comparação e saída do UNIX diff (unificado). Todos os arquivos são UTF-8: link

    
por Andrey Balaguta 29.01.2010 / 20:11

4 respostas

2

Pode-se resolver o problema usando o parâmetro -SyncWindow. O valor deve ser metade do tamanho de uma coleção menor em comparação:

> Compare-Object -SyncWindow ($a.length / 2) $a $b

Fonte: link

    
por 31.01.2010 / 14:10
1

Isto é devido ao export-clixml / import-clixml. Na verdade, ele altera o tipo de cada objeto de arquivo de System.IO.FileSystemInfo para Deserialized.System.IO.FileInfo.

Tenha seu segundo comando ls export-clixml em um arquivo temporário, em seguida, importe e compare com ele e isso deverá corrigir o problema.

    
por 29.01.2010 / 21:43
1

Um bom exemplo que eu encontrei é isso.

Obtenha o status original dos serviços:

$before = get-service

Agora faça algumas alterações no serviço, por exemplo, encerre 1 e inicie 1.

Obtenha o novo status dos serviços:

$after = get-service

Em seguida, compare as duas listas (diff é um alias para Compare-Object):

diff $before $after -property name,status

Exemplos de resultados:

PS> diff $before $after -property name,status

name                                                                     status SideIndicator
----                                                                     ------ -------------
Spooler                                                                 Stopped =>
Spooler                                                                 Running <=

Demonstra o 1º objeto com o < =, 2º objeto da alteração vista com a = & gt ;. Ou simplesmente uma perspectiva de antes e depois. Você também pode criar um rótulo e uma expressão para mostrar a palavra "Alterado", caso haja um = & gt ;.

Usando isso, você também pode ver em uma comparação quando algo está na primeira lista, mas estava na segunda. Muito parecido com uma consulta de busca sem correspondência.

    
por 03.01.2012 / 22:14
0

Pessoalmente, acho que o diff funciona melhor se você puder classificá-lo primeiro

Tente

$b = (import-clixml dir-20100130.xml) | sort
$a = (import-clixml dir-20100129.xml) | sort
diff $a $b
    
por 01.10.2010 / 07:49

Tags