fc.exe
é melhor para comparação de texto, pois ele foi projetado para funcionar como * nix diff, ou seja, compara linhas sequencialmente, mostrando as diferenças reais e tentando sincronizar novamente (se as seções diferentes tiverem comprimentos diferentes). Ele também possui algumas opções de controle úteis (texto / binário, distinção entre maiúsculas e minúsculas, números de linhas, comprimento de ressincronização, tamanho do buffer incompatível) e fornece status de saída (-1 sintaxe incorreta, 0 arquivos iguais, 1 arquivo diferente, 1 arquivo diferente e 2 arquivos ausentes). Sendo um utilitário (muito) antigo do DOS, ele tem algumas limitações. Mais notavelmente, ele não funciona automaticamente com Unicode, tratando os 0 MSB de caracteres ASCII como um terminador de linha, para que o arquivo se torne uma sequência de 1 linha de caracteres (@kennycoc: use a opção / U para especificar AMBOS os arquivos são Unicode, WinXP em diante ) e também possui um tamanho de buffer de linha direta de 128 caracteres (128 bytes ASCII,
compare-object foi desenvolvido para determinar se 2 objetos são idênticos em termos de membros. se os objetos são coleções, eles são tratados como SETS (consulte a ajuda de comparação de objetos), ou seja, coleções não ordenadas sem duplicatas. 2 conjuntos são iguais se tiverem os mesmos itens de membro, independentemente de pedido ou duplicação. Isso limita severamente sua utilidade na comparação de arquivos de texto quanto a diferenças. Primeiramente, o comportamento padrão coleta as diferenças até que todo o objeto (file = array of strings) tenha sido verificado, perdendo as informações sobre a posição das diferenças e obscurecendo quais diferenças estão emparelhadas (e não existe um conceito de número de linha para um SET de cordas). O uso de -synchwindow 0 fará com que as diferenças sejam emitidas à medida que ocorrem, mas impede a tentativa de sincronizar novamente. Se um arquivo tiver uma linha extra, as comparações de linha subsequentes poderão falhar, mesmo que os arquivos sejam idênticos (até que exista uma compensação linha extra no outro arquivo realinhando as linhas correspondentes). No entanto, o PowerShell é extremamente versátil e uma comparação útil de arquivos pode ser feita utilizando essa funcionalidade, embora ao custo de uma complexidade substancial e com algumas restrições sobre o conteúdo dos arquivos. Se você precisar comparar arquivos de texto com linhas longas (> 127 caracteres) e onde as linhas correspondem principalmente a 1:
diff (gc file1 | % -begin { $ln1=0 } -process { '{0,6}<<:{1}' -f ++$ln1,$_ }) (gc file2 | % -begin { $ln2=0 } -process { '{0,6}>>:{1}' -f ++$ln2,$_ }) -property { $_.substring(9) } -passthru | sort | out-string -width xx
onde xx é o comprimento da linha mais longa + 9
Explicação
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
obtém o conteúdo do arquivo e anexa o número da linha e o indicador do arquivo (<< ou >>) a cada linha (usando o operador de cadeia de formatação) antes de passá-lo para diff.
-property { $_.substring(9) }
diz ao diff para comparar cada par de objetos (strings) ignorando os 9 primeiros caracteres (que são o número da linha e o indicador de arquivo). Isso utiliza a capacidade de especificar uma propriedade calculada (o valor de um bloco de script) em vez do nome de uma propriedade.
-passthru
faz com que diff produza os diferentes objetos de entrada (que incluem o número da linha e o indicador de arquivo) em vez dos diferentes objetos comparados (que não).
sort-object
depois coloca todas as linhas de volta em seqüência.
out-string interrompe o truncamento padrão da saída para caber na largura da tela (conforme observado por Marc Towersap) especificando uma largura grande o suficiente para evitar o truncamento. Normalmente, essa saída é colocada em um arquivo que é visualizado usando um editor de rolagem (por exemplo, o bloco de notas).
Nota
O formato do número da linha {0,6} fornece um número de linha com 6 caracteres, justificado à direita e preenchido com espaço (para classificação). Se os arquivos tiverem mais de 999.999 linhas, basta alterar o formato para ser maior. Isso também requer a alteração do $_.substring
parâmetro (3 a mais que a largura do número da linha) e o valor xx da cadeia de caracteres (comprimento máximo da linha + $_.substring
parâmetro).