我如何比较 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 个简单的步骤。
- 枚举文件夹
$source
中的文件。
- 通过将
$source
部分替换为 $destination
来为每个文件创建目标路径。
- 检查每个文件的
LastWriteTime
或 CreationTime
属性是否在 $days
之前被修改或创建,具体取决于您所说的 "older" .
- 如果文件较旧,请检查目标路径的目录部分是否存在,否则创建它。
- 将文件移动到目标路径。
如果要排除现有目标文件,请在步骤 3 中添加对目标路径的检查。
你好,我想在 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 个简单的步骤。
- 枚举文件夹
$source
中的文件。 - 通过将
$source
部分替换为$destination
来为每个文件创建目标路径。 - 检查每个文件的
LastWriteTime
或CreationTime
属性是否在$days
之前被修改或创建,具体取决于您所说的 "older" . - 如果文件较旧,请检查目标路径的目录部分是否存在,否则创建它。
- 将文件移动到目标路径。
如果要排除现有目标文件,请在步骤 3 中添加对目标路径的检查。