Powershell File Compare
I am using a PowerShell script to move some files around on some servers. I want to test if a file I am going to move already开发者_JS百科 exists in the destination. Not just a file with the same name.
I thought
Compare-Object $File1 $File2
InputObject SideIndicator
----------- -------------
D:\1.gif =>
D:\1.wma <=
Is there some other way to test if two files are identical?
(Get-FileHash $path1).Hash -eq (Get-FileHash $path2).Hash
I guess it's going to depend on your definition of "The same"
Compare-Object (ls Source\Test.*) (ls Dest\Test.*) -Property Name, Length, LastWriteTime
That will compare the actual FILE objects by name, length, and modified date. Adding -IncludeEqual will result in also showing ones that are the same in both places.
If you want to only copy files from "Source" which aren't the same in the "Destination" just do this:
Compare-Object (ls $Source) (ls $Destination) -Property Name, Length, LastWriteTime -passthru |
Where { $_.PSParentPath -eq (gi $Source).PSPath } |
Copy-Item $Destination
DO NOT start writing scripts that get-content (as suggested by others) to do a file comparison -- you'd be loading everything into memory...
DO consider using robocopy (even though it's command-line syntax is dated). =Þ
You're just giving two strings to Compare-Object
, you want the file contents:
Compare-Object (gc $File1) (gc $File2)
Also the output you're giving does not mean that the files are the same.
What's wrong with comp.exe
or fc.exe
? Just check the $? after calling them to see if the command succeeded or not.
compare $file1 $file2 -includeequal -excludedifferent
You can test the file contents for equality, given paths $path1
and $path2
like so:
[io.file]::ReadAllText($path1) -eq [io.file]::ReadAllText($path2)
... Though you may choose instead to compare results of the ::ReadAllBytes()
method.
To be honest, I just use Robocopy, even from PowerShell, when I care about copying only changed-or-added files.
精彩评论