Loops Powershell删除最旧的项目

Loops Powershell删除最旧的项目,loops,powershell,for-loop,do-while,Loops,Powershell,For Loop,Do While,我试图使用do-while循环删除多个目录中的旧文件(从最旧的目录开始),直到剩下一个目录为止,此时程序应该结束。仅当运行时目录中有多个文件时,程序才应运行 这是我的环境: 顶部文件夹 文件夹1 文件夹2 等 在文件夹1、文件夹2等中,应该只有一个文件。脚本应该删除除最新文件以外的所有内容,如果其中只有一个文件,则什么也不删除 我使用以下代码完成了这项工作: $basedir = "C:\Test" Set-Location -Path C:\Test $a = Get-ChildIt

我试图使用do-while循环删除多个目录中的旧文件(从最旧的目录开始),直到剩下一个目录为止,此时程序应该结束。仅当运行时目录中有多个文件时,程序才应运行

这是我的环境:

  • 顶部文件夹
    • 文件夹1
    • 文件夹2
在文件夹1、文件夹2等中,应该只有一个文件。脚本应该删除除最新文件以外的所有内容,如果其中只有一个文件,则什么也不删除

我使用以下代码完成了这项工作:

$basedir = "C:\Test"
Set-Location -Path C:\Test

$a = Get-ChildItem -recurse $basedir

if ($a.Count -gt 1) {
    do 
    {
        $a | Sort-Object LastWriteTime -Descending | Select-Object -Last 1 | remove-item
    }
    while
    (
        $a.Count -gt 1
    )
}  
  • 它将仅在存在多个文件时运行,这是正确的
  • 它会正确地删除最旧的文件,但随后会继续尝试删除相同的文件,而不是重新检查目录
  • 在这一点上,我所需要的帮助是让它在删除一个文件后重新运行循环,而不是反复尝试删除同一个文件
  • 衷心感谢您的帮助,如果之前有人回答过,我深表歉意。我做了很多搜索,但找不到与我的情况有关的东西


    Brad

    要修复您的问题,您应该在每次通过循环时重新定义$a,或者干脆避免使用$a$a不会因为创建对象时存在的子项已更改而更改

    另一种方法是只选择文件夹中最后的n-1项

    #Get Items that aren't folders
    $items = Get-ChildItems "c:\test" | ? {!($_.PSIsContainer)}
    #Get a count - this is easier in PoSh 3
    $itemCount = ($items | Measure-Object).Count
    
    if ($itemCount -gt 1){
       $items | Sort-Object LastWriteTime -Descending | Select-Object -Last ($itemCount - 1) | Remove-Item
    }
    
    递归地做这件事也相当容易。首先,我们将获得执行工作所需的所有文件夹,然后将上面的代码移动到foreach循环中:

    $folders = Get-ChildItems "C:\test" -recurse | ? {$_.PSIsContainer}
    
    foreach ($folder in $folders) {
    
       #Get Items that aren't folders
       $items = Get-ChildItems $folder.FullName | ? {!($_.PSIsContainer)}
       #Get a count - this is easier in PoSh 3
       $itemCount = ($items | Measure-Object).Count
    
       if ($itemCount -gt 1){
          $items | Sort-Object LastWriteTime -Descending | Select-Object -Last ($itemCount - 1) | Remove-Item
       }
     }
    

    您可能需要同时运行这两个脚本来修剪根目录,或者在foreach循环之前添加类似于
    $folders+=Get Item“C:\test”
    的内容,我已经按照建议重新格式化了,抱歉!很抱歉,虽然您的答案在使用一个文件夹时是绝对正确的,但我忽略了这个脚本需要递归运行的事实。我将更新我的原始问题。也许我们需要某种“对于X路径中的每个文件夹”?