2010-08-16 4 views
10

J'utilise un script PowerShell pour déplacer certains fichiers sur certains serveurs. Je veux tester si un fichier que je vais déplacer existe déjà dans la destination. Pas seulement un fichier avec le même nom.Powershell File Compare

Je pensais que

Compare-Object $File1 $File2
devrait le faire, mais peu importe ce que les fichiers sont il revient toujours qu'ils sont les mêmes par exemple.

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

Existe-t-il un autre moyen de tester si deux fichiers sont identiques?

+0

Vous pouvez utiliser DOS (dans les PS): '** fc.exe "fichier1" « fichier2 "**' (Note: doit être "fc.exe" car "fc" est "format-custom" dans PowerShell.) Ceci donne une sortie beaucoup moins cryptique. – Andrew

Répondre

6

Je suppose que cela va dépendre de votre définition de « la même »

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

qui permettra de comparer les objets de fichier réel par nom, la longueur et la date de modification. L'ajout de -IncludeEqual entraînera également l'affichage de ceux qui sont identiques aux deux endroits.

Si vous voulez seulement copier les fichiers de « Source » qui ne sont pas les mêmes dans la « Destination » faire ceci:

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

NE PAS commencer à écrire des scripts qui obtiennent contenu (comme suggéré par D'autres) pour faire une comparaison de fichiers - vous charger tout en mémoire ...

Pensez à utiliser robocopy (même si sa syntaxe de ligne de commande est datée). = Þ

+0

Merci c'est la direction dans laquelle je pense que je dois aller – zebidy

1

Vous pouvez tester le contenu du fichier pour l'égalité, les chemins donnés $path1 et $path2 comme ceci:

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

... Bien que vous pouvez choisir au lieu de comparer les résultats de la méthode ::ReadAllBytes().

Pour être honnête, j'utilise simplement Robocopy, même à partir de PowerShell, quand je me soucie de copier uniquement les fichiers modifiés ou ajoutés.

+1

Oui j'ai commencé le chemin Robocopy mais dioscovered il n'a pas répondu à mes exigences malheureusement. Évidemment, c'est une solution courante que tout ce que j'ai trouvé avec Google semble mener à RoboCopy. – zebidy

+1

Juste par curiosité, en quoi Robocopy ne répondait-il pas à vos exigences? – kbrimington

+0

Prenez soin de cette méthode: vous chargez complètement 2 fichiers dans la mémoire et ensuite les comparez ... = très de mémoire exigeant –

5

Vous êtes juste donner deux chaînes à Compare-Object, vous voulez que le contenu du fichier:

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

également la sortie vous donne, ce ne pas signifie que les fichiers sont les mêmes.

3

Qu'est-ce qui ne va pas avec comp.exe ou fc.exe? Juste vérifier le $? après les avoir appelés pour voir si la commande a réussi ou non.

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

Cela compare les deux chaînes, pas le contenu du fichier –

1

(Get-fileHash $ chemin1) .hash de (Get-fileHash path2 $) .hash

+1

Est-ce vraiment mieux qu'une solution acceptée? –