0

我正在尝试使用 do while 循环来删除多个目录中的旧文件(从最旧的开始),直到剩下一个,此时程序应该结束。该程序也应该只在运行时目录中有多个文件时才运行。

这是我的环境:

  • 顶部文件夹
    • 文件夹 1
    • 文件夹 2
    • ETC

在文件夹 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 回答 1

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
   }
 }

您可能还需要运行这两个脚本来修剪根,或者$folders += Get-Item "C:\test"在 foreach 循环之前添加类似的内容

于 2013-08-28T14:27:12.993 回答