Сравнение файлов 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, когда мне нужно копировать только измененные или добавленные файлы.