2010-08-16 79 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