2010-08-16 18 views
10

Estoy usando un script de PowerShell para mover algunos archivos en algunos servidores. Quiero probar si un archivo que voy a mover ya existe en el destino. No es solo un archivo con el mismo nombre.Powershell File Compare

pensé

Compare-Object $File1 $File2
En caso de hacerlo, pero no importa lo que los archivos son siempre devuelve que son los mismos por ejemplo.

InputObject   SideIndicator        
-----------   -------------        
D:\1.gif    =>           
D:\1.wma    <=  

¿Hay alguna otra forma de comprobar si dos archivos son idénticos?

+0

Usted puede utilizar DOS (dentro PS): '** fc.exe "archivo1" "fichero2 "**' (Nota: debe ser "fc.exe" como "fc" es "formato-personalizado" en PowerShell). Esto proporciona una salida mucho menos críptica. – Andrew

Respuesta

6

supongo que va a depender de su definición de "Lo mismo"

Compare-Object (ls Source\Test.*) (ls Dest\Test.*) -Property Name, Length, LastWriteTime 

que comparará los objetos reales de los archivos por nombre, longitud, y fecha de modificación. Agregar -IncludeEqual dará como resultado también mostrar los que son iguales en ambos lugares.

Si desea copiar sólo los archivos de "Fuente", que no son los mismos en el "destino" acaba de hacer esto:

Compare-Object (ls $Source) (ls $Destination) -Property Name, Length, LastWriteTime -passthru | 
Where { $_.PSParentPath -eq (gi $Source).PSPath } | 
Copy-Item $Destination 

NO arranque escribir guiones que se interponen en el contenido (como lo sugiere otros) para hacer una comparación de archivos: usted estaría cargando todo en la memoria ...

Considere el uso de robocopy (aunque la sintaxis de la línea de comandos es antigua). = Þ

+0

Gracias esta es la dirección en la que creo que necesito ir – zebidy

1

puede probar el contenido de los archivos para la igualdad, caminos dados $path1 y $path2 así:

[io.file]::ReadAllText($path1) -eq [io.file]::ReadAllText($path2) 

... Aunque usted puede elegir en lugar de comparar los resultados del método ::ReadAllBytes().

Para ser honesto, solo uso Robocopy, incluso de PowerShell, cuando me importa copiar solo los archivos modificados o modificados.

+1

Sí, comencé a recorrer el camino de Robocopy, pero descubrí que no cumplía con mis requisitos por desgracia. Obviamente, esta es una solución común, ya que todo lo que encontré con Google parece conducir a RoboCopy. – zebidy

+1

Solo por curiosidad, ¿de qué manera Robocopy no cumple con sus requisitos? – kbrimington

+0

Cuide con este método: está cargando 2 archivos completamente en la memoria y luego los compara ... = muy memoria exigente –

5

Sólo estás dando dos cadenas de Compare-Object, desea que el contenido del archivo:

Compare-Object (gc $File1) (gc $File2) 

también la salida que está dando hace no quiere decir que los archivos son los mismos.

3

¿Qué pasa con comp.exe o fc.exe? Solo revisa los $? después de llamarlos para ver si el comando tuvo éxito o no.

2
compare $file1 $file2 -includeequal -excludedifferent 
+0

Esto compara ambas cadenas, no el contenido del archivo –

1

(Get-FileHash $ rutaDeAcceso1) .hash eq (Get-FileHash $ via2) .hash

+1

¿Es esto realmente mejor que una solución aceptada desde hace años? –