2013-01-08 63 views
1

我已經給出了比較2個文件夾FolderA和FolderB的任務,並且注意到A中存在但不存在於B中的任何文件。比較2個文件夾並將路徑保存到變量中?

對不起沒有完全解釋我自己。如果我解釋我們的情況,這可能會有所幫助。一家公司的銷售員工已經離開了我們公司去參加競爭對手。他在他的工作筆記本電腦本地硬盤驅動器上存檔。我們試圖確定他的計算機上是否存在任何文件,但不在共享網絡文件夾中。

我需要產生任何文件(及其路徑)的列表,這些文件存在於他的筆記本電腦上,但不在共享網絡位置。筆記本電腦本地硬盤驅動器和共享網絡位置之間的文件結構不同。什麼是最好的方式去做這件事?

$folderAcontent = "C:\temp\test1" 
$folderBcontent = "C:\temp\test2" 

$FolderAContents = Get-ChildItem $folderAcontent -Recurse | where-object {!$_.PSIsContainer} 
$FolderBContents = Get-ChildItem $folderBcontent -Recurse | where-object {!$_.PSIsContainer} 

$FolderList = Compare-Object -ReferenceObject ($FolderAContents) -DifferenceObject ($FolderBContents) -Property name 
$FolderList | fl * 
+0

只是比較文件名(例如test.txt)還是文件內容?文件是否具有唯一的文件名,或者它們是否存儲在名稱相同的子文件夾中?我們怎麼知道他們是否匹配? –

+0

抱歉沒有完全解釋自己。我已經用更多的信息更新了這個問題。只需要文件名並考慮它的大小,不需要比較內容,除非這樣做更容易。它唯一的文件名我有興趣比較兩組文件夾之間的位置有不同的結構。如果文件名和大小相同,它們是匹配的。 – resolver101

+0

我現在更改了我的答案來說明文件大小。我的舊和其他答案只比較文件名。 –

回答

2

假設在這兩個目錄中的文件名是一樣的,你可以這樣做以下: -

$folderAcontent = "C:\temp\test1" 
$folderBcontent = "C:\temp\test2" 

ForEach($File in Get-ChildItem -Recurse -LiteralPath $FolderA | where {$_.psIsContainer -eq $false} | Select-Object Name) 
{ 
    if(!(Test-Path "$folderBcontent\$File")) 
{ 
    write-host "Missing File: $folderBcontent\$File" 
} 
} 

以上將只對文件(不是子目錄)出現在文件夾中的

工作
+0

該代碼不應該工作。 1。你的'$ file'變量在任何地方都沒有定義。第2位。它不適用foldera或folderb下的子文件夾。 –

+0

對不起。我實際上編輯了代碼,但忘記了正確執行。讓我糾正一下。 – Max

1

嘗試:

#Set locations 
$laptopfolder = "c:\test1" 
$serverfolder = "c:\test2" 

#Get contents 
$laptopcontents = Get-ChildItem $laptopfolder -Recurse | where {!$_.PSIsContainer} 
$servercontents = Get-ChildItem $serverfolder -Recurse | where {!$_.PSIsContainer} 

#Compare on name and length and find changed files on laptop 
$diff = Compare-Object $laptopcontents $servercontents -Property name, length -PassThru | where {$_.sideindicator -eq "<="} 

#Output differences 
$diff | Select-Object FullName 

如果LEN之後添加lastwritetime在比較對象cmdlet中,它也會比較修改日期(如果文件已更新但仍具有相同的大小)。請注意,它只會尋找不同的日期,而不會更新或更舊。 :)

5

使用比較對象cmdlet:

Compare-Object (gci $folderAcontent) (gci $folderBcontent) 
如果你想列出了僅在$ folderAcontent文件選擇與< = SideIndicator結果

Compare-Object (gci $folderAcontent) (gci $folderBcontent) | where {$_.SideIndicator -eq "<="} 
+0

這是最簡單的方法來做他想做的事情,除了你需要添加'-Recurse'開關,以便它將獲得子文件夾中的所有文件(在他的問題中顯示) – Nick

+0

也他想要的路徑缺少文件。所以用'|來擴展它%{$ _。inputobject.fullname}' –

+0

btw。這將工作,如果相同的文件名在不同的子文件夾?它不只是比較文件的toString()值(僅文件名)? –

相關問題