如何实现并行作业和队列系统

时间:2014-06-28 21:40:01

标签: powershell csv parallel-processing

我花了几天时间尝试实现并行作业和队列系统,但是......我试过但我做不到。以下是没有实现任何内容的代码,以及来自外观的CSV示例。

我确信这篇文章可以帮助他们的项目中的其他用户。

每个用户都有自己的电脑,因此CSV文件如下所示:

pc1,user1
pc2,user2
pc800,user800 

CODE:

#Source File:
$inputCSV = '~\desktop\report.csv'
$csv = import-csv $inputCSV -Header PCName, User
echo $csv #debug

#Output File:
$report = "~\desktop\output.csv"

#---------------------------------------------------------------

#Define search:
$findSize = 40GB
Write-Host "Lonking for $findSize GB sized Outlook files"

#count issues:
$issues = 0 

#---------------------------------------------------------------

foreach($item in $csv){

    if (Test-Connection -Quiet -count 1 -computer $($item.PCname)){

        $w7path = "\\$($item.PCname)\c$\users\$($item.User)\appdata\Local\microsoft\outlook"

        $xpPath = "\\$($item.PCname)\c$\Documents and Settings\$($item.User)\Local Settings\Application Data\Microsoft\Outlook"

            if(Test-Path $W7path){

                if(Get-ChildItem $w7path -Recurse -force -Include *.ost -ErrorAction "SilentlyContinue" | Where-Object {$_.Length -gt $findSize}){

                    $newLine =  "{0},{1},{2}" -f $($item.PCname),$($item.User),$w7path
                    $newLine |  add-content $report

                    $issues ++
                    Write-Host "Issue detected" #debug
                    }
            }

            elseif(Test-Path $xpPath){

                if(Get-ChildItem $w7path -Recurse -force -Include *.ost -ErrorAction "SilentlyContinue" | Where-Object {$_.Length -gt $findSize}){

                    $newLine =  "{0},{1},{2}" -f $($item.PCname),$($item.User),$xpPath
                    $newLine |  add-content $report

                    $issues ++
                    Write-Host "Issue detected" #debug
                    }
            }

            else{
                write-host "Error! - bad path"
            }
    }

    else{
        write-host "Error! - no ping"
    }
}

Write-Host "All done! detected $issues issues"

1 个答案:

答案 0 :(得分:1)

PowerShell中的并行数据处理并不是很简单,尤其是 排队。尝试使用已经完成的一些现有工具。 你可以看看模块 SplitPipeline。 cmdlet Split-Pipeline专为并行输入数据处理和支持而设计 排队输入(参见参数Load)。例如,对于4个并行 每行10个输入项的管道,代码如下所示:

$csv | Split-Pipeline -Count 4 -Load 10, 10 {process{
    <operate on input item $_>
}} | Out-File $outputReport

您所要做的就是实现代码<operate on input item $_>。 并行处理和排队由此命令完成。


更新更新的问题代码。这是一些原型代码 备注。它们很重要。并行工作不一样 直接,有一些规则要遵循。

$csv | Split-Pipeline -Count 4 -Load 10, 10 -Variable findSize {process{
    # Tips
    # - Operate on input object $_, i.e $_.PCname and $_.User
    # - Use imported variable $findSize
    # - Do not use Write-Host, use (for now) Write-Warning
    # - Do not count issues (for now). This is possible but make it working
    # without this at first.
    # - Do not write data to a file, from several parallel pipelines this
    # is not so trivial, just output data, they will be piped further to
    # the log file
    ...
}} | Set-Content $report
# output from all jobs is joined and written to the report file

更新:如何编写进度信息

  

SplitPipeline很好地处理了800个目标csv,太棒了。无论如何还有   让用户知道脚本是否还活着......?扫描一个大的csv可以采取   20分钟像“进行中25%”,“50%”,“75%”......

有几种选择。最简单的就是调用Split-Pipeline 开关-Verbose。因此,您将获得有关进度的详细消息 看到剧本还活着。

另一个简单的选择是编写和查看来自作业的详细消息, 例如Write-Verbose ... -Verbose即使是,也会写消息 在没有Split-Pipeline的情况下调用Verbose

另一种选择是使用Write-Progress的正确进度消息。 请参阅脚本:

Test-ProgressTotal.ps1还显示了如何使用从作业更新的收集器 同时。您可以使用类似的技术来计算问题( 原始问题代码执行此操作)。全部完成后显示总数 向用户提出问题。