fc.exe
es mejor para la comparación de texto, ya que está diseñado para funcionar como * nix diff, es decir, compara líneas secuencialmente, muestra las diferencias reales y trata de volver a sincronizar (si las secciones diferentes tienen longitudes diferentes). También tiene algunas opciones de control útiles (texto / binario, mayúsculas y minúsculas, números de línea, longitud de resincronización, tamaño de búfer no coincidente) y proporciona el estado de salida (-1 sintaxis incorrecta, 0 archivos iguales, 1 archivo diferente, faltan 2 archivos). Al ser una (muy) antigua utilidad de DOS, tiene algunas limitaciones. En particular, no funciona automáticamente con Unicode, tratando el 0 MSB de caracteres ASCII como un terminador de línea, por lo que el archivo se convierte en una secuencia de líneas de 1 carácter (@kennycoc: use la opción / U para especificar AMBOS archivos son Unicode, WinXP en adelante ) y también tiene un tamaño de búfer de línea dura de 128 caracteres (128 bytes ASCII,
compare-object está diseñado para determinar si 2 objetos son idénticos en cuanto a miembros. si los objetos son colecciones, entonces se tratan como SETS (consulte la ayuda para comparar objetos), es decir, colecciones SIN ORDENAR sin duplicados. 2 conjuntos son iguales si tienen los mismos elementos miembros independientemente del orden o las duplicaciones. Esto limita severamente su utilidad para comparar archivos de texto en busca de diferencias. En primer lugar, el comportamiento predeterminado recopila las diferencias hasta que se haya verificado todo el objeto (archivo = matriz de cadenas), perdiendo así la información sobre la posición de las diferencias y ocultando qué diferencias están emparejadas (y no hay un concepto de número de línea para un SET de cuerdas). El uso de -synchwindow 0 hará que se emitan las diferencias a medida que ocurren, pero evita que intente volver a sincronizarse, por lo que si un archivo tiene una línea adicional, las comparaciones de líneas posteriores pueden fallar aunque los archivos sean idénticos (hasta que haya un compensatorio línea adicional en el otro archivo, realineando las líneas coincidentes). Sin embargo, powershell es extremadamente versátil y se puede realizar una comparación de archivos útil utilizando esta funcionalidad, aunque a costa de una complejidad sustancial y con algunas restricciones sobre el contenido de los archivos. Si necesita comparar archivos de texto con líneas largas (> 127 caracteres) y donde las líneas coinciden principalmente con 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
donde xx es la longitud de la línea más larga + 9
Explicación
(gc file | % -begin { $ln=0 } -process { '{0,6}<<:{1}' -f ++$ln,$_ })
obtiene el contenido del archivo y antepone el número de línea y el indicador de archivo (<< o >>) a cada línea (usando el operador de cadena de formato) antes de pasarlo a diff.
-property { $_.substring(9) }
le dice a diff que compare cada par de objetos (cadenas) ignorando los primeros 9 caracteres (que son el número de línea y el indicador de archivo). Esto utiliza la capacidad de especificar una propiedad calculada (el valor de un bloque de script) en lugar del nombre de una propiedad.
-passthru
hace que diff muestre los diferentes objetos de entrada (que incluyen el número de línea y el indicador de archivo) en lugar de los diferentes objetos comparados (que no lo hacen).
sort-object
luego vuelve a poner todas las líneas en secuencia.
out-string detiene el truncamiento predeterminado de la salida para que se ajuste al ancho de la pantalla (como señaló Marc Towersap) al especificar un ancho lo suficientemente grande como para evitar el truncamiento. Normalmente, esta salida se colocaría en un archivo que luego se verá utilizando un editor de desplazamiento (por ejemplo, el bloc de notas).
Nota
El formato de número de línea {0,6} proporciona un número de línea de 6 caracteres justificado a la derecha y con espacio (para ordenar). Si los archivos tienen más de 999,999 líneas, simplemente cambie el formato para que sea más ancho. Esto también requiere alterar el $_.substring
parámetro (3 más que el ancho del número de línea) y el valor xx de la cadena (longitud máxima de línea + $_.substring
parámetro).