我在C:\
驱动器中创建了3个文件夹 - new folder1
,new folder2
和new folder3
。
new folder1
包含五个.txt
个文件,new folder2
包含相同的五个文件以及更多文件。
现在,我想比较文件夹1
和2
,并将仅将 new folder1
中的常用文件复制到new folder3
。 (这就像从new folder1
和new folder2
备份常见文件一样。)
我想排除复制所有不常见的文件。 我写的代码是:
cls
$folder1 = dir C:\new folder1
$folder2 = dir C:\new folder2
$difference = Compare-Object $new folder1 $new folder2
write-host "`n Missing files are " $difference
foreach($i in $folder1)
{
copy-item C:\new folder1 -Destination C:\new folder3 -Exclude $difference -Recurse
}
但此代码会将所有文件从new folder1
复制到new folder3
。怎么做得好?
答案 0 :(得分:1)
您可以尝试这样的事情:
$folder1 = 'C:\new folder1'
$folder2 = 'C:\new folder2'
$folder3 = 'C:\new folder3'
Get-ChildItem $folder1 | Where-Object {
Test-Path (Join-Path $folder2 $_.Name)
} | ForEach-Object {
Copy-Item $_.FullName -Destination $folder3
}
它获取folder1中的所有文件,检查它们是否也在folder2中,并将每个文件复制到folder3。与单线相同:
gci 'C:\new folder1' | ? { Test-Path (Join-Path 'C:\new folder2' $_.Name) } | % { cp $_.FullName 'C:\new folder3' }
答案 1 :(得分:1)
你接近答案。 Compare-object
应该有效。
像这样使用它:
cd C:\folder1
$folder1 = Get-ChildItem -Path c:\folder1 -Filter *.txt -File -Name
$folder2 = Get-ChildItem -Path C:\folder2 -Filter *.txt -File -Name
Compare-Object -ReferenceObject $folder1 -DifferenceObject $folder2 -IncludeEqual -ExcludeDifferent -PassThru |
Copy-Item -Destination 'C:\temp\folder3'
$folder1
和$folder2
将仅包含文本文件名。
请注意-passthru
与compare-object
的使用。来自管道的文件将复制到folder3