我的脚本中有一点性能问题,所以我想实现某种工作者theads。但到目前为止我还没有找到解决方案..
我希望是这样的:
有没有人知道如何做到这一点?
答案 0 :(得分:0)
您可以使用Powershell工作流程执行此操作。
来自Windows PowerShell: What is Windows PowerShell Workflow?
如果您愿意,工作流程也可以并行执行。对于 例如,如果您有一组可以按任何顺序运行的任务,则没有 相互依赖,然后你可以让他们都或多或少地运行 同一时间
只需搜索“Powershell工作流程”,您就会找到大量文档来帮助您入门。
答案 1 :(得分:0)
使用工作的基本方法是:
$task1 = { ls c:\windows\system32 -r *.dll -ea 0 | where LastWriteTime -gt (Get-Date).AddDays(-21) }
$task2 = { ls E:\Symbols -r *.dll | where LastWriteTime -gt (Get-Date).AddDays(-21) }
$task3 = { Invoke-WebRequest -Uri http://blogs.msdn.com/b/mainfeed.aspx?Type=BlogsOnly | % Content }
$job1 = Start-Job $task1; $job2 = Start-Job $task2; $job3 = Start-Job $task3
Wait-Job $job1,$job2,$job3
$job1Data = Receive-Job $job1
$job2Data = Receive-Job $job2
$job3Data = Receive-Job $job3
如果您需要让这些后台作业在循环中等待工作,因为主脚本要求查看this SO answer以了解如何使用MSMQ来执行此操作。
答案 2 :(得分:0)
在Keith Hill指出的一些帮助下 - 我得到了它的工作 - 感谢一堆......
这是对我的概念证明的代码的剪切:
function New-Task([int]$Index,[scriptblock]$ScriptBlock) {
$ps = [Management.Automation.PowerShell]::Create()
$res = New-Object PSObject -Property @{
Index = $Index
Powershell = $ps
StartTime = Get-Date
Busy = $true
Data = $null
async = $null
}
[Void] $ps.AddScript($ScriptBlock)
[Void] $ps.AddParameter("TaskInfo",$Res)
$res.async = $ps.BeginInvoke()
$res
}
$ScriptBlock = {
param([Object]$TaskInfo)
$TaskInfo.Busy = $false
Start-Sleep -Seconds 1
$TaskInfo.Data = "test $($TaskInfo.Data)"
}
$a = New-Task -Index 1 -ScriptBlock $ScriptBlock
$a.Data = "i was here"
Start-Sleep -Seconds 5
$a
这里的结果证明数据已传递到线程中并再次传回:
Data : test i was here
Busy : False
Powershell : System.Management.Automation.PowerShell
Index : 1
StartTime : 11/25/2013 7:37:07 AM
async : System.Management.Automation.PowerShellAsyncResult
你可以看到$ a.data现在在前面有“测试”
非常感谢...