Powershell比较Lastwritedate并删除文件

Powershell比较Lastwritedate并删除文件,powershell,compare,delete-file,Powershell,Compare,Delete File,我真的很想“结束”这个脚本。我已经创建了一个小脚本,但是有了这个脚本,我只能从我输入的第一个字典中删除文件 脚本应该比较两个文件夹,如果有同名文件,我想选择是删除旧版本还是新版本 //编辑 $path1 = Read-Host "Name the 1st Path" $path2 = Read-Host "Name the 2nd Path" $Folder1 = Get-ChildItem -Path $pfad1 -Recurse $Folder2 = Get-ChildItem -Pat

我真的很想“结束”这个脚本。我已经创建了一个小脚本,但是有了这个脚本,我只能从我输入的第一个字典中删除文件

脚本应该比较两个文件夹,如果有同名文件,我想选择是删除旧版本还是新版本

//编辑

$path1 = Read-Host "Name the 1st Path"
$path2 = Read-Host "Name the 2nd Path"
$Folder1 = Get-ChildItem -Path $pfad1 -Recurse 
$Folder2 = Get-ChildItem -Path $pfad2 -Recurse
Write-Host "####################################"
Write-Host ( Get-ChildItem $pfad1,$pfad2 ).count
Write-Host "Files are in the folder"
Write-Host "####################################"
$frage = Read-Host "Are you sure you want to delete the files YES / NO ?"


if ($frage -eq $NO) { "Files stay " ; exit }
else {
        Compare-Object -ReferenceObject $Folder1 -DifferenceObject $Folder2 
 -IncludeEqual |
            Where-Object {$_.SideIndicator -eq "=="} | 
            ForEach-Object { 
            Remove-Item $_.InputObject.FullName | where { $_.lastwritetime -lt $altdate  } 
            }
                }

根据文件夹的大小,这可能不是最有效的方法。但它确实有效

$files = $folder1 + $folder2
$files | 
    Group-Object name | 
    Foreach-Object {
        $_.Group | 
        Sort-Object LastWriteTime | 
        Select-Object -Last 1 
    } | 
    Remove-Item -Force
嗯。Iv'e修改了我原来的答案,以解决它的一些缺点。这个答案使您能够通过使用测试代码查看哪些内容将被删除和保留。我知道我本可以使用适当的详细开关和whatif功能,但这似乎更容易。我已经解决了订购问题和删除不重复项目的问题

$folder1 = 'c:\temp\reports1' 
$folder2 = 'c:\temp\reports2'


function Get-FilesForDeletion ($folder1, $folder2, [switch] $verbose){
    $files1 = Get-ChildItem $folder1
    $files2 = Get-ChildItem $folder2

    $files = $files1 + $files2

    $i = ($files | Select-Object -ExpandProperty Directory | Measure-Object -Maximum -Property Length).Maximum

    $files | 
        Group-Object name | 
        Where-Object Count -gt 1 |
        Foreach-Object {    
            $process = $_

            $deleteMe = $process.Group | 
                    Sort-Object LastWriteTime -Descending | 
                    Select-Object -Last 1 

            if($verbose){
                Write-Host "Processing $($process.Group.Name)..."

                $keepThese = $process.Group | 
                    Sort-Object LastWriteTime | 
                    Select-Object -Skip 1 

                Write-Host "  - Delete  $(($deleteMe.Directory.FullName).PadRight($i)) - LastWriteTime $($deleteMe.lastWriteTime) "

                $keepThese | ForEach-Object {
                    Write-Host "  - Keep    $(($_.Directory.FullName).PadRight($i)) - LastWriteTime $($_.lastWriteTime) "
                }              

                write-host " "
                write-host " "
            }

            $deleteMe
        } 
}

# testing code
#Get-FilesForDeletion -folder1 $folder1 -folder2 $folder2 -verbose | Out-Null

Get-FilesForDeletion -folder1 $folder1 -folder2 $folder2 -verbose | Remove-Item

请添加您迄今为止尝试过的内容,并将您的问题限制在特定问题上。因此,代码编写页面还没有完成,而且我第一次尝试时,它成功了。现在它不再工作了。它只删除最新的文件,不比较文件名…哎呀,您需要在组和组之间为每个文件添加一个where对象{$\ count-gt 1}。只是找到第一张唱片应该是这样的
code$path1=Read Host“命名第一条路径”$path2=Read Host“命名第二条路径”$folder1=Get ChildItem-Path$path2-Recurse$folder2=Get ChildItem-Path$path1-Recurse$files=$folder1+$folder2$files |组对象名|其中每个对象{$\ count gt 1}{$\.Group |排序对象LastWriteTime |选择对象-Last 1}| Remove Item-Force
看起来你在foreach之前错过了一个管道操作符|。管道操作符用于将输出从一个函数传递到下一个函数。这使得测试代码非常容易。在测试过程中,将脚本拆分为测试,例如函数1、函数1+2、函数1+2+3等。你的脚本不会在任何情况下工作时间。啊,是的,我找到你了!谢谢。它现在可以工作了。但是现在只有一件小事。它不会比较文件的日期。它只是从你调用的第一个文件夹中删除到重复的文件。。。