2010-08-16 102 views
10

我正在使用PowerShell腳本在某些服務器上移動某些文件。 我想測試一個我要移動的文件是否已經存在於目標中。 不只是一個具有相同名稱的文件。Powershell文件比較

我想

Compare-Object $File1 $File2
應該這樣做,但無論文件是什麼,它總是返回,他們是相同的 如。

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

有沒有其他的方法來測試兩個文件是否相同?

+0

您可以使用DOS(內PS):'** FC.EXE 「文件1」,「文件2 「**'(注意:必須是」fc.exe「,因爲」fc「是PowerShell中的」格式自定義「)。這會產生更少的神祕輸出。 – Andrew 2017-11-18 17:16:34

回答

6

我想這將取決於你的「相同」

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

定義,將名稱,長度和修改日期比較實際的文件對象。添加-IncludeEqual將導致在兩個地方都顯示相同的結果。

如果你想只從「源」,這是不是在「目標」一樣複製文件只是這樣做:

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

不要開始編寫腳本,獲取內容(所建議其他人)做一個文件比較 - 你會將所有內容加載到內存中......

請考慮使用robocopy(即使命令行語法過期)。 =>

+0

謝謝這是我認爲我需要去的方向 – zebidy 2010-08-17 01:23:37

1

您可以測試相等文件內容,給出路徑$path1$path2像這樣:

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

...雖然你可能會轉而選擇比較::ReadAllBytes()方法的結果。

說實話,我只使用Robocopy,即使是從PowerShell,當我關心只複製已更改或添加的文件。

+1

是的,我開始了Robocopy路徑,但是對它進行了分類,並沒有很好地滿足我的要求。很明顯,這是一個常見的解決方案,因爲我發現Google的一切似乎都會導致RoboCopy。 – zebidy 2010-08-17 01:08:24

+1

出於好奇,Robocopy以何種方式不符合您的要求? – kbrimington 2010-08-17 01:38:22

+0

關心這種方法:你正在將2個文件完全加載到內存中,然後比較它們...... =非常需要內存 – 2013-04-07 11:23:39

5

你只是給兩個字符串Compare-Object,你想要的文件的內容:

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

而且你給輸出不意味着文件是相同的。

3

comp.exefc.exe有什麼問題?只需檢查$?在調用它們以查看命令是否成功之後。

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

這比較了兩個字符串,而不是文件的內容 – 2013-03-19 10:40:08

1

(GET-FileHash $路徑1).Hash當量(GET-FileHash $ PATH2).Hash

+1

這是真的比一個歲,被接受的解決方案好嗎? – 2018-01-29 10:13:32