执行get-childitem,但是以相反的顺序进行迭代?

时间:2019-05-30 15:56:06

标签: powershell

我有一个充满500,00+个文件的文件夹。我正在尝试遍历此文件夹并运行一些逻辑以确定我们是否可以删除不需要的文件。问题是此过程需要半定期运行,并且需要删除的新文件当前似乎在列表的末尾。

我整理了以下代码列表以对所有代码进行排序:

gci $RPT | %{
$flag = 0;

$number = [int]($_.Name | select-string -pattern "\d{12}" -Allmatches).Matches.Value

if ($submidlist -match "^$number$"){
    if ($_ -notmatch "acct\.csv|jpd\.csv|jss\.pdf|jman\.pdf|3600\.pdf|cont\.pdf|msl\.txt|pres\.pdf|tray\.pdf|qual\.pdf|zipl\.pdf"){
        echo "DELETE SUBMID $_"
        remove-item $RPT\$_

        $count++
        $totalcount++
        $flag = 1;
    }
}

if ($jobidlist -match "^$number$"){
    if ($_ -match "acct\.csv|jpd\.csv|jss\.pdf|jman\.pdf|3600\.pdf|cont\.pdf|msl\.txt|pres\.pdf|tray\.pdf|qual\.pdf|zipl\.pdf"){
        echo "DELETE JOBID $_"
        remove-item $RPT\$_
        $count++
        $totalcount++
        $flag = 1;
    }
}

}

当前,运行以上脚本需要超过24个小时,但仍未到达列表末尾。有没有一种方法可以优化此设置或反转get-childitem遍历此文件夹的顺序?

1 个答案:

答案 0 :(得分:0)

function Delete-Items($List, [string]$ListName){

    $DoNotDelete = @("acct.csv","jpd.csv","jss.pdf","jman.pdf","3600.pdf","cont.pdf","msl.txt","pres.pdf","tray.pdf","qual.pdf","zipl.pdf")

    $List = $List | %{
        "*$_*"
    }
    Get-ChildItem C:\TEST\56381643\ -Recurse -Include $List -Directory | %{
        Get-ChildItem $_.FullName -Exclude $DoNotDelete -Recurse | %{          
                echo "DELETE $ListName $($_.name | select-string -pattern "\d{12}")"
                Remove-Item -Path $_.FullName -WhatIf
        }
    } 
}

#Example Usage
$JobList = @(
    098765432109
    123456789012

)

$SubmitList = @(
    234567890123
)

Delete-Items -List $JobList -ListName JOBID
Delete-Items -List $SubmitList -ListName SUBMID

让我们回顾一下函数中发生的事情的基本概要。

我们有一系列文件不可删除

我们通过在数组中的每个项目之前和之后添加一个$list,将*的数字转换为通配符。然后,我们仅搜索包含这些数字的目录。

然后,我们使用另一个Get-ChildItem to get the files in each directory but exclude the ones mentioned in $ DoNotDelete`。

如果要删除文件,请删除-Whatif上的remove-item