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

How I can compare two Directories in Powershell and move the items then older x days?

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

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

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

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

第二个问题是如果我用两个目录测试它(folderA 有 10000 个 pdf 文件 xD)而 folderB 只有一个 test.txt(因为如果文件夹为空然后我得到 null 并且无法比较)。

我的想法是,我可以将 folderA 与 folderB 进行比较,并将所有(比 x 天更早的文件和文件夹)移动到 folderB。只有文件夹 A -> 文件夹 B

这是我的完整代码:

#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!"
    }
}

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

  1. 枚举文件夹$source中的文件。
  2. 通过将 $source 部分替换为 $destination 来为每个文件创建目标路径。
  3. 检查每个文件的 LastWriteTimeCreationTime 属性是否在 $days 之前被修改或创建,具体取决于您所说的 "older" .
  4. 如果文件较旧,请检查目标路径的目录部分是否存在,否则创建它。
  5. 将文件移动到目标路径。

如果要排除现有目标文件,请在步骤 3 中添加对目标路径的检查。