【问题标题】:Comparing files within folders and moving files not found in one folder to a different location比较文件夹中的文件并将在一个文件夹中找不到的文件移动到不同的位置
【发布时间】:2015-12-30 20:49:47
【问题描述】:

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

我希望将 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

【问题讨论】:

  • 如果符合唯一标准,我将明确测试文件名
  • 两个平面文件夹,或者子文件夹中也可以有文件?文件应该放在哪里?您要复制每个文件夹中的唯一文件,还是仅复制其中一个文件夹?

标签: file powershell directory


【解决方案1】:

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

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

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

diff = 比较对象,ls = 获取子项

【讨论】:

  • 这是否会在c:\test\folder1\sub1\file.txtc:\test\folder2\sub2\file.txt 的情况下中断 - 它们是唯一路径中的两个唯一文件,都应该被复制出来,但 diff 会将它们视为匹配名称,两者都不会被复制?
  • 此代码适用于上面的基本示例。现在,如果我们要移动两个位置都不存在的文件夹,那可能会变得很冒险。
【解决方案2】:

这将完成工作,任何不在文件夹 1 和文件夹 2 中的文件都将被移动到文件夹 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
        }
}

【讨论】:

  • 对于@Zach Smith 想要做的事情,它可能是可行的代码,但它并没有按照你说的去做;仅在 Folder2 中的文件“不在 Folder1 和 Folder2 中”,但不会移动到 Folder3。
【解决方案3】:

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

# 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%。玩弄代码,玩得开心,祝你好运。

【讨论】:

    猜你喜欢
    • 2022-12-25
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多