我如何比较Powershell中的两个目录并将项目移动到更旧的x天?

时间:2015-05-21 13:32:59

标签: powershell recursion compare move get-childitem

嗨我想在Powershell中比较两个对象。对象是目录。 例如:

$folderA = gci $source -Recurse
$folderB = gci $destination -Recurse

$diff = Compare-Object -ReferenceObject $folderA -DifferenceObject $folderB -PassThru | Where-Object {$_.SlideIndicator -eq "<="}

第一个问题是如果folderB没有元素,则对象为null -.-

第二个问题是如果我用两个Directorys测试它(folderA有10000个pdf文件xD),而folderB只有一个test.txt(因为如果文件夹为空,那么我得到null并且不能比较)。

我的想法是,我可以使用folderB comapre folderA并将所有(旧的x天文件和文件夹)移动到folderB。只有folderA - &gt; FolderB中

这是我的完整代码:

#Vergleicht zwei Objekte und führt eine Aktion durch
function compareFiles($source,$destination,$days){

    Write-Host "compareFiles(): Es werden zwei Objekte miteinander verglichen"

    #Ermitellt wie alt die Daten sein müssen
    $lastwrite = (Get-Date).AddDays(-$days)

    #Enthält alle Elemente aus dem source Verzeichniss
    $folderA = Get-ChildItem $source -Recurse

    #Definiert eine Testdatei im Falle das Verzeichniss Destination leer ist
    $f = $destination +"\test.txt"

    #Prüft ob das Zielverzeichniss existiert
    if(!(Test-Path $destination -PathType Container)){

        #Erstellt das Zielverzeichniss
        New-Item -ItemType Container -Path $destination -Force 
        Write-Host "NEW FOLDER :" $destination

        #Erstellt die Testdatei im Zielverzeichnis
        New-Item -ItemType File -Path $f -Force
        Write-Host "NEW FILE :" $destination 

    }else{

        #Prüft ob das Zielverzeichniss leer ist
        if((Get-ChildItem $destination) -eq $null){

            #Erstellt die testdatei
            New-Item -ItemType File -Path $f -Force 
            Write-Host "NEW FILE :" $destination
        }
    }


    #Enthält alle Elemente aus dem destination Verzeichniss
    $folderB = Get-ChildItem $destination -Recurse

    #Gibt die Unterschiede zurück
    $diff = Compare-Object -ReferenceObject $folderA -DifferenceObject $folderB -PassThru | Where-Object {$_.SlideIndicator -eq "<="}
    Write-Host ""
    try{

        #Durchläuft alle Elemente in dem Compare Objekt (Unterschiede)
        foreach($element in $diff){

            #Gibt den Vollständigen Pfad von einem Element zurück
            $element_fullname = $element.FullName 

            #Erstellt ein Zielpfad für das Element
            $targetFile = $destination + $element.FullName.SubString($source.Length)

            #Prüft ob das Element ein Ordner ist
            if($element.PSIsContainer){

                #Erstellt einen Ordner 
                New-Item -ItemType Container -Path $targetFile -Force
                Write-Host "NEW FOLDER :" $element.FullName
            }
            else
            {
                #Prüft das Datum von einem Element mit dem definierten Datum ab 
                if($element.creationTime -le $lastwrite){

                    #Verschiebt das Element zum Zielpfad
                    #Move-Item $element.FullName -Destination $targetFile
                    Copy-Item $element.FullName -Destination $targetFile
                    Write-Host "COPY FILE : " $element.FullName
                }
            }
        }

    }catch{
        Write-Host "Es besteht kein Unterschied zwischen den Verzeichnissen!"
    }
}

1 个答案:

答案 0 :(得分:1)

我会简单地使用robocopy $source $destination /s /minage:$days,但是因为你说你想学习如何自己动手:它只需要5个简单的步骤。

  1. 枚举文件夹$source
  2. 中的文件
  3. $source部分替换为$destination,为每个文件创建目标路径。
  4. 检查每个文件的LastWriteTimeCreationTime属性是否已被修改或创建超过$days前,具体取决于您对“较旧”的含义。
  5. 如果文件较旧,请检查目标路径的目录部分是否存在,否则创建它。
  6. 将文件移动到目标路径。
  7. 如果要排除现有目标文件,请添加对步骤3的目标路径的检查。