Powershell并行循环
发布时间:2020-12-15 07:07:55 所属栏目:安全 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 function ForEach-Parallel {#.SYNOPSISA parallel ForEach that uses runspaces.PARAMETER ScriptBlockScriptBlock to execute for each InputObject
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 function ForEach-Parallel { <# .SYNOPSIS A parallel ForEach that uses runspaces .PARAMETER ScriptBlock ScriptBlock to execute for each InputObject .PARAMETER ScriptFile Script file to execute for each InputObject .PARAMETER InputObject Object(s) to run script against in parallel .PARAMETER Throttle Maximum number of threads to run at one time. Default: 5 .PARAMETER Timeout Stop each thread after this many minutes. Default: 0 WARNING: This parameter should be used as a failsafe only Set it for roughly the entire duration you expect for all threads to complete .PARAMETER SleepTimer When looping through open threads,wait this many milliseconds before looping again. Default: 200 .EXAMPLE (0..50) | ForEach-Parallel -Throttle 4 { $_; sleep (Get-Random -Minimum 0 -Maximum 5) } } Send the number 0 through 50 to scriptblock. For each,display the number and then sleep for 0 to 5 seconds. Only execute 4 threads at a time. .EXAMPLE $servers | Foreach-Parallel -Throttle 20 -Timeout 60 -sleeptimer 200 -verbose -scriptFile C:query.ps1 Run query.ps1 against each computer in $servers. Run 20 threads at a time,timeout a thread if it takes longer than 60 minutes to run,give verbose output. .FUNCTIONALITY PowerShell Language .NOTES Credit to Tome Tanasovski http://powertoe.wordpress.com/2012/05/03/foreach-parallel/ #> [cmdletbinding()] param( [Parameter(Mandatory=$false,position=0,ParameterSetName='ScriptBlock')] [System.Management.Automation.ScriptBlock]$ScriptBlock,[Parameter(Mandatory=$false,ParameterSetName='ScriptFile')] [ValidateScript({test-path $_ -pathtype leaf})] $scriptFile,[Parameter(Mandatory=$true,ValueFromPipeline=$true)] [PSObject]$InputObject,[int]$Throttle=5,[double]$sleepTimer = 200,[double]$Timeout = 0 ) BEGIN { #Build the scriptblock depending on the parameter used switch ($PSCmdlet.ParameterSetName){ 'ScriptBlock' {$ScriptBlock = $ExecutionContext.InvokeCommand.NewScriptBlock("param(`$_)`r`n" + $Scriptblock.ToString())} 'ScriptFile' {$scriptblock = [scriptblock]::Create($(get-content $scriptFile | out-string))} Default {Write-Error ("Must provide ScriptBlock or ScriptFile"); Return} } #Define the initial sessionstate,create the runspacepool Write-Verbose "Creating runspace pool with $Throttle threads" $sessionState = [system.management.automation.runspaces.initialsessionstate]::CreateDefault() $pool = [Runspacefactory]::CreateRunspacePool(1,$Throttle,$sessionState,$host) $pool.open() #array to hold details on each thread $threads = @() #If inputObject is bound get a total count and set bound to true $bound = $false if( $PSBoundParameters.ContainsKey("inputObject") ){ $bound = $true $totalCount = $inputObject.count } } PROCESS { $run = @' #For each pipeline object,create a new powershell instance,add to runspacepool $powershell = [powershell]::Create().addscript($scriptblock).addargument($InputObject) $powershell.runspacepool=$pool $startTime = get-date #add references to inputobject,instance,handle and startTime to threads array $threads += New-Object psobject -Property @{ Object = $inputObject; instance = $powershell; handle = $powershell.begininvoke(); startTime = $startTime } Write-Verbose "Added $inputobject to the runspacepool at $startTime" '@ #Run the here string. Put it in a foreach loop if it didn't come from the pipeline if($bound){ $run = $run -replace 'inputObject','object' foreach($object in $inputObject){ Invoke-Expression -command $run } } else{ Invoke-Expression -command $run } } END { $notdone = $true #Loop through threads. while ($notdone) { $notdone = $false for ($i=0; $i -lt $threads.count; $i++) { $thread = $threads[$i] if ($thread) { #If thread is complete,dispose of it. if ($thread.handle.iscompleted) { Write-verbose "Closing thread for $($thread.Object)" $thread.instance.endinvoke($thread.handle) $thread.instance.dispose() $threads[$i] = $null } #Thread exceeded maxruntime timeout threshold elseif( $Timeout -ne 0 -and ( (get-date) - $thread.startTime ).totalminutes -gt $Timeout ){ Write-Error "Closing thread for $($thread.Object): Thread exceeded $Timeout minute limit" -TargetObject $thread.inputObject $thread.instance.dispose() $threads[$i] = $null } #Thread is running,loop again! else { $notdone = $true } } } #Sleep for specified time before looping again Start-Sleep -Milliseconds $sleepTimer } } } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 初探Angular6.x---主从组件
- 单元测试 – 如何同步对akka Actor进行单元测试?
- Jax-ws 开发webService ,并使用spring注入servi
- 递增变量会触发bash 4中的EXIT,但不会触发bash 3
- Angular 5组件不是任何NgModule的一部分
- Angular开发实践(七): 跨平台操作DOM及渲染器
- angularjs – 设置ng-repeat内的无线电的默认值(
- 【数据结构】邓玉欣的编程作业indexing
- angularjs – grunt karma getting error …加载
- scala – Future.onComplete:无法理解方法签名
热点阅读