2015-02-23 54 views
1
複製文件

方案:* .PDF在Folder1中* .RTF在文件夾2,兩個文件夾具有相同的文件名,但不同的擴展名。需要將兩個文件夾進行比較,然後僅將* .rtf等於=>從Folder2複製到Folder3。比較不同的文件擴展名並使用PowerShell

腳本:

Compare-Object (Get-childitem $Folder1 -Recurse | foreach-object {$_.basename}) (Get-childitem $Folder2 -Recurse | foreach-object {$_.basename})  -Property RelativePath, Name, Length | 
Sort RelativePath, Name, Length -desc | % { 
if ($file -ne $_.RelativePath) 
{ $_ } 
$file = $_.RelativePath 
} | Where-Object {$_.SideIndicator -eq "=>"} | ForEach-Object {Copy-Item ("$Folder2\" + $file) -Destination ("$Folder3\" + $file) -Force} 

回答

1

通常你實際上應該有一個問題。我不知道你從哪裏得到了財產RelativePath,所以我提出這應該是相當容易遵循。我本可以把它變成一行命令,但是,這又更可讀。

$Folder1 = "C:\temp\folder1" 
$Folder2 = "C:\temp\folder2" 
$Folder3 = "C:\temp\folder3" 
$Folder1Contents = Get-childitem $Folder1 -Recurse -Include *.pdf 
$Folder2Contents = Get-childitem $Folder2 -Recurse -Include *.rtf 

Compare-Object $Folder1Contents $Folder2Contents -Property BaseName -PassThru | Where-Object{$_.SideIndicator -eq "=>"} | Move-Item -Destination $Folder3 -Force -WhatIf 

採取PDF文件$Folder1$Folder2比較它們的RTF文件。如果在$Folder2一個.rtf文件,然後它會被移動到$Folder3-Force將覆蓋並在該目錄中已經存在的文件,以便刪除-WhatIf一旦你完成測試。

+0

是啊,我忘了問問題的實際。但你盯住它。完美工作。謝謝。 – 2015-02-24 04:49:39

0

最終結果:我添加了一個成績單,並進行記錄,如果/ ELSEIF語句。雙比較對象只是爲了比較結果將顯示在日誌中。謝謝你的幫助,馬特,你救了我幾個小時的頭痛。

$Folder1 = "C:\temp\folder1" 
$Folder2 = "C:\temp\folder2" 
$Folder3 = "C:\temp\folder3"  
$log = "C:\logs\compare.log" 

$ErrorActionPreference="SilentlyContinue" 
Stop-Transcript | out-null 
$ErrorActionPreference = "Continue" 

$OutputFileLocation = "$log" 
Start-Transcript -path $OutputFileLocation -append 


$folder1contents = Get-childitem $folder1 -Recurse -Include *.pdf 
$folder2contents = Get-childitem $folder1 -Recurse -Include *.rtf 

$filecheck = "C:\temp\folder1\*.pdf" 
$filepresent = Test-Path $filecheck 

if ($filepresent -eq $false) 
{ 
Write-host "No Files To Compare" 
} 

elseif ($filepresent -eq $true) 
{ 
Compare-Object $folder1contents $folder2contents -Property BaseName -PassThru 
Compare-Object $folder1contents $folder2contents -Property BaseName -PassThru | Where-Object{$_.SideIndicator -eq "=>"} | Copy-Item -Destination $folder3 -Force 

} 

stop-transcript