Powershell GCI工作流程 - 嵌套的Foreach并行可能吗?危险?

时间:2017-02-16 14:14:11

标签: powershell foreach parallel-processing workflow get-childitem

我创建了一个工作流程,以递归方式扫描数百个文件共享以查找特定文件名/扩展名。一切都很好,但我想知道是否有办法提高它的速度。

在foreach-parallel,我从共享列表中递归获取子项和ACL,每次20个。我想知道的是,是否有办法让它在GCI内并行处理。

换句话说,foreach-并行嵌套是可行/可行的,如果是这样,你可以提供诸如语法,做这些等的危险等建议。我发现它的文档很少,我希望一些专家建议

如果这没有意义,可以采用不同的方式来解释它。我有5个我正在递归搜索的股票,所有股票都有不同的尺寸和不同数量的文件:

\ share1 \ folder1大小:5GB

\ share2 \ folder1大小:79GB

\ share3 \ folder1大小:2GB

\ share4 \ folder1大小:8GB

\ share5 \ folder1大小:103GB

GCI将同时处理所有5个,但是由于它们的大小,share2和share5将比其他的花费更多的时间。有没有办法让脚本并行处理所有5个共享,并在GCI中同时处理多个文件?那么它会一次开始搜索所有20个股票,并一次获得有关共享中5个文件的信息吗?

这是我正在做的事情,由于长度原因缩短了一点,变量名称/输入已更改。我确信在这里我可以改进一些事情,但总的来说它是有效的。

workflow Scan-Shares
{
[cmdletbinding()]
param(
    [int]$ThrottleLimit = 20
    )

        $File1 = Import-csv C:\Drives.csv
        $ExtList = @((Invoke-WebRequest -Uri "www.websitewithfilenames.com").content | convertfrom-json | % {$_.filters})

        foreach -parallel -throttlelimit $throttlelimit ($Line in $File1)
            {
                inlinescript
                {
                 $Line=$using:Line
                 $Extlist=$using:Extlist
                 $Path = $Line.Path + '\*'
                 $Directory = Get-ChildItem -Path $path -Recurse  -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue  | select-object   name, Extension, FullName, LastWriteTime, Directory -ExpandProperty Name

                 $singleRegex = ($extlist | %{ '^' + $_ + '$' }) -join '|'

                 [array]$Files = $Directory -match $singleRegex

                    if($files.count -gt 0 )
                    {
                        foreach($SingleFile in $Files)
                        {

                         $Owner = (Get-Acl $FullName -Erroraction SilentlyContinue -WarningAction SilentlyContinue).Owner 
                         New-Object -TypeName PSCustomObject -Property @{
                                        Path = $File.Fullname
                                        Filename = $File.Name
                                        LastWriteTime = $File.LastWriteTime
                                        Owner = $Owner
                                        Directory = $File.Directory } |
                                      Export-Csv -Force C:\Share-Results.CSV -Append
                        }
                    }
                }
            }

}

0 个答案:

没有答案