Powershell删除最旧的项目

时间:2013-08-28 13:57:15

标签: loops powershell for-loop do-while

我正在尝试使用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
    )
}  
  1. 仅当存在多个文件时才会运行,这是正确的。
  2. 它正确删除了最旧的文件,但它继续尝试删除相同的文件,而不是重新检查目录。
  3. 此时我需要的帮助是让它在删除文件后重新运行循环,而不是一遍又一遍地尝试删除同一个文件。
  4. 真诚地感谢您的任何帮助,如果以前已经回答过,我会道歉。我做了很多搜索,但找不到我的情况。

    布拉德

1 个答案:

答案 0 :(得分:0)

要修复你的问题,你应该在每次通过循环时重新定义$ 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"之类的内容