比较文件夹中的文件和将一个文件夹中找不到的文件移动到其他位置

时间:2015-12-30 20:49:48

标签: file powershell directory

我正在处理包含许多类型和大小的文件的文件夹。我想要做的是将一个文件夹中未包含的文件移动到一个新文件夹中。我已经嵌入了一个图片链接,可以帮助说明我的目标。

enter image description here

我希望test123.pdf移动到新位置,因为它不包含在其他文件夹中。下面我有一些代码只是比较每个文件夹的内容并输出哪个文件不合适。我一直在网上研究一些东西,但是空洞的。任何人都可以帮我继续吗?

免责声明:我知道路径错误,但出于安全原因我无法显示。

$Folder1 = Get-ChildItem -Recurse -path "Enter Path here"
$Folder2 = Get-ChildItem -Recurse -path "Enter the Path here"

Compare-Object -ReferenceObject $Folder1 -DifferenceObject $Folder2

3 个答案:

答案 0 :(得分:0)

听起来您想要比较两个文件夹的内容,识别两个文件夹中不存在的文件,然后将它们移动到第三个文件夹。为此,您可以在变量中定义2个路径,比较文件夹的内容,获取不同项的完整路径名,然后将它们移动到新目标。

$path1 = yourfirstpath
$path2 = yoursecondpathforcomparing
$path3 = yourdestinationpath

diff (ls $path1 -recurse) (ls $path2 -recurse) | ForEach {$_.InputObject.FullName} | Move-Item -Destination $path3

diff = Compare-Object,ls = Get-ChildItem

答案 1 :(得分:0)

这将完成工作,任何文件夹都不在Folder1& Folder2将移至文件夹3

$Folder1 = 'C:\folder1'
$Folder2 = 'C:\folder2'
$Folder3 = 'C:\folder3'

foreach ($file in Get-ChildItem -Recurse $Folder1)
{
    if (-not(Test-Path "$Folder2\$file"))
        {
        Move-Item $file.FullName $Folder3
        }
}

答案 2 :(得分:0)

这将按文件名进行比较,并维护找到额外文件的目录结构,并正确处理递归。代码的输出演示了我测试过的目录结构。

# be explict here to ensure everything is lowercase
# so when this is cut and pasted, it does not break
# when you enter the real path
$d1 = "d:\test\one".ToLower()
$d2 = "d:\test\two".ToLower()

$f1 = gci -Recurse $d1 -File | % {$_.FullName.ToLower()}
$f2 = gci -Recurse $d2 -File | % {$_.FullName.ToLower()}

"f1"
$f1
"`nf2"
$f2

$same = @()
$extra = @()
foreach ($f in $f2)
{
    $f2tof1path = $f.Replace($d2, $d1)
    if ($f1.Contains($f2tof1path) -eq $false) 
    {
        $extra += $f
    }
    else {
        $same += $f
    }
}

"`nSame"
$same

"`nExtra"
$extra

"`nMOVE"
$folder3 = "d:\test\three"
foreach ($f in $extra) 
{
    # move files somewhere, create dir if not exists
    $dest = $f.Replace($d2,$folder3)
    $destdir = $(Split-Path -Parent -Path $dest)
    if (!(Test-Path $destdir))
    {
        # remove quotes to do new-item, keep them to show what it will do
        "New-Item -ItemType Directory -Force -Path $destdir"
    }
    # remove quotes to do move-item, keep them to show what it will do
    "Move-Item $f $dest"
}

输出

f1
d:\test\one\1.txt
d:\test\one\2.txt
d:\test\one\sub\1.txt
d:\test\one\sub\2.txt

f2
d:\test\two\1.txt
d:\test\two\2.txt
d:\test\two\3.txt
d:\test\two\sub\1.txt
d:\test\two\sub\2.txt
d:\test\two\sub\3.txt

Same
d:\test\two\1.txt
d:\test\two\2.txt
d:\test\two\sub\1.txt
d:\test\two\sub\2.txt

Extra
d:\test\two\3.txt
d:\test\two\sub\3.txt

MOVE
New-Item -ItemType Directory -Force -Path d:\test\three
Move-Item d:\test\two\3.txt d:\test\three\3.txt
New-Item -ItemType Directory -Force -Path d:\test\three\sub
Move-Item d:\test\two\sub\3.txt d:\test\three\sub\3.txt

如果这不能解决你的问题,它应该会让你99%。玩弄代码,玩得开心,祝你好运。