【问题标题】:How to get values from workflow parallel code block?如何从工作流并行代码块中获取值?
【发布时间】:2019-10-28 21:35:49
【问题描述】:

我正在尝试并行运行两个Invoke-Sqlcmd,然后等待所有结果。

$server1 = '...'
$server2 = '...'

workflow work {
  parallel {
    $r1 = Invoke-Sqlcmd -ServerInstance $server1 'select 1 a'
    $r2 = Invoke-Sqlcmd -ServerInstance $server2 'select 2 a'
  }
}
work
# do something with $r1 and $r2. How to access the variables here?
  1. 如何将$server1$server2 传递给代码块?
  2. 如何从并行块中获取$r1$r2

【问题讨论】:

  • 鉴于工作流已经过时(PowerShell Core 不再支持它们),我建议查看Start-ThreadJob - 请参阅this answer
  • 您可以使用param () 传入服务器。除了$result = work $server1 $server2,不知道如何获得结果。也许工作更容易。
  • @mklement0,我试过 ThreadJob。但它不适用于 Invoke-SqlCmd stackoverflow.com/questions/58609740/…
  • 有趣,@ca9163d9:我认为问题是Invoke-SqlCmd 中的一个错误,如我对您的链接问题的评论中所述。您可以使用常规的基于子进程的后台作业 (Start-Job) 解决此问题,但请注意,它们比线程作业的开销要多得多 - 但是对于长时间运行的 SQL 查询来说并不重要。跨度>

标签: powershell powershell-workflow


【解决方案1】:

因此,使用参数传入服务器,并返回两个结果的哈希表。

$server1 = '...'
$server2 = '...'

workflow work {
  param ($server1, $server2)
  parallel {
    @{r1 = Invoke-Sqlcmd -ServerInstance $server1 'select 1 a'}
    @{r2 = Invoke-Sqlcmd -ServerInstance $server2 'select 2 a'}
  }
}
$r = work $server1 $server2
$r.r1
$r.r2

【讨论】:

  • 它有效。但是,我将使用Start-ThreadJob,因为@mklement0 在评论中提到工作流已过时。
  • 我不确定它是否仍然是并行的。
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多