嗨我想在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!"
}
}
答案 0 :(得分:1)
我会简单地使用robocopy $source $destination /s /minage:$days
,但是因为你说你想学习如何自己动手:它只需要5个简单的步骤。
$source
。$source
部分替换为$destination
,为每个文件创建目标路径。LastWriteTime
或CreationTime
属性是否已被修改或创建超过$days
前,具体取决于您对“较旧”的含义。如果要排除现有目标文件,请添加对步骤3的目标路径的检查。