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
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
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
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.
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.
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
Tags powershell