2012-12-15 42 views
0

我有脚本,通过start-job启动几个运行脚本块。将值传递给运行/后台脚本块的最佳方式是什么?

将某些变量/值传递给正在运行的后台脚本块的最佳方法是什么?

有一些选项,如服务经纪人/队列,文件等有没有更轻的方式?

例如,

$sb = { 
    $Value = $args[0] # initial value 
    while ($true) 
    { 
     # Get more values from caller 
     $Value = ..... 
    } 
} 
start-job -ScriptBlock $sb -ArgumentList $initValue 
# There are more values to send to the script after the script block is started. 
while (moreVaulesAvailable) 
{ 
    # $sb.Value = .... newly generated values ? 
} 

Start-Job开始另一个PowerShell进程。是否有任何内置机制在PS进程之间传递值?

+0

它不清楚这里的预期。 – Siddharth

回答

4

您可以使用MSMQ来做到这一点。 PowerShell V3附带有一个MSMQ模块。这里有一个如何将消息传递给使用MSMQ后台任务的例子:

$sb = { 
    param($queueName) 
    $q = Get-MsmqQueue $queueName 
    while (1) { 
     $messages = @(try {Receive-MsmqQueue -InputObject $q -RetrieveBody} catch {}) 
     foreach ($message in $messages) 
     { 
      "Job received message: $($message.Body)" 

      if ($message.Body -eq '!quit') 
      { 
       return 
      } 
     } 
     Start-Sleep -Milliseconds 1000 
     "Sleeping..." 
    } 
} 

$queueName = 'JobMessages' 
$q = Get-MsmqQueue $queueName 
if ($q) 
{ 
    "Clearing the queue $($q.QueueName)" 
    $q | Clear-MsmqQueue > $null  
} 
else 
{ 
    $q = New-MsmqQueue $queueName 
    "Created queue $($q.QueueName)" 
} 

$job = Start-Job -ScriptBlock $sb -ArgumentList $queueName -Name MsgProcessingJob 
"Job started" 

$msg = New-MsmqMessage "Message1 for job sent at: $(Get-Date)" 
Send-MsmqQueue -Name $q.Path -MessageObject $msg > $null 

Receive-Job $job 

$msg = New-MsmqMessage "Message2 for job sent at: $(Get-Date)" 
Send-MsmqQueue -Name $q.Path -MessageObject $msg > $null 

$msg = New-MsmqMessage "!quit" 
Send-MsmqQueue -Name $q.Path -MessageObject $msg > $null 

Wait-Job $job -Timeout 30 
Receive-Job $job 
Get-Job $job.Name 
Remove-Job $job 

当我运行该脚本,我得到以下的输出:

C:\PS> .\MsmqQueue.ps1 
Clearing the queue private$\jobmessages 
Job started 

Id  Name   PSJobTypeName State   HasMoreData  Location    Command 
--  ----   ------------- -----   -----------  --------    ------- 
4  MsgProcessin... BackgroundJob Completed  True   localhost   ... 
Job received message: Message1 for job sent at: 12/15/2012 17:53:39 
Sleeping... 
Job received message: Message2 for job sent at: 12/15/2012 17:53:39 
Sleeping... 
Job received message: !quit 
4  MsgProcessin... BackgroundJob Completed  False   localhost   ... 
+0

我们仍在使用Windows Server 2003,因此无法安装Powershell 3.0。 – user1906067

+0

还有其他MSMQ解决方案可用。事实上,PowerShell社区扩展包含一组MSMQ cmdlet。 –

相关问题