Сравнение файлов Powershell

Я использую PowerShell script для перемещения некоторых файлов на некоторых серверах. Я хочу проверить, есть ли файл, который я собираюсь переместить, уже существует в пункте назначения. Не только файл с тем же именем.

Я думал, что

Compare-Object $File1 $File2
Должен это делать, но независимо от того, какие файлы он всегда возвращает, что они одинаковы например.

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

Есть ли другой способ проверить, идентичны ли два файла?

Ответ 1

Я предполагаю, что это будет зависеть от вашего определения "Тот же"

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

Это будет сравнивать фактические объекты FILE по имени, длине и измененной дате. Добавление -IncludeEqual приведет к тому, что в обоих местах будут одинаковые.

Если вы хотите копировать только файлы из "Source", которые не совпадают в "Destination", просто выполните это:

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

НЕ начинайте писать сценарии, которые получают-контент (как это было предложено другими) для сравнения файлов - вы будете загружать все в память...

Считайте использование robocopy (даже при том, что синтаксис командной строки датирован). = Th

Ответ 2

Вы просто передаете две строки Compare-Object, вы хотите, чтобы содержимое файла:

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

Также вывод, который вы даете, не означает, что файлы одинаковы.

Ответ 3

Что случилось с comp.exe или fc.exe? Просто проверьте $? после вызова их, чтобы увидеть, удалась ли команда или нет.

Ответ 4

compare $file1 $file2 -includeequal -excludedifferent

Ответ 5

(Get-FileHash $path1).Hash -eq (Get-FileHash $path2).Hash

Ответ 6

Вы можете проверить содержимое файла для равенства, заданные пути $path1 и $path2 следующим образом:

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

... Хотя вы можете вместо этого сравнить результаты метода ::ReadAllBytes().

Если честно, я просто использую Robocopy даже из PowerShell, когда мне нужно копировать только измененные или добавленные файлы.