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プロセス間で値を渡すための組み込みメカニズムはありますか?

4

1 に答える 1

4

これを行うには、MSMQを使用できます。PowerShellV3に付属する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            ...
于 2012-12-16T00:56:39.187 に答える