Powershell - 如何在函数内使用 Start-Job 调用两个函数并传递计算机名称列表?
Powershell - How to call two functions using Start-Job within a function and pass a list of computer names?
我有一个导入模块的主脚本 \path\to\functions.psm1,
我在主脚本中调用了一个名为:Run_Scans $ServerList 的函数,它来自 functions.psm1,
从 Run_Scans 我尝试使用 Start-Job 调用另外两个函数(Scan1、Scan2),但无法获取服务器变量以传递给其他函数。我已经尝试了几种不同的方法来处理作业失败或完成但服务器列表确实通过了。任何帮助将不胜感激。
#This is from the main script#
Import-Module "path\to\Functions.psm1"
Run_Scans $ServerList
#This is from functions.psm1#
Function Run_Scans ($Servers){
#Start-Job -Name 'Scan1' -ScriptBlock {Run_Scan1 $using:Servers}
#Start-Job -Name 'Scan2' -ScriptBlock {Run_Scan2 $using:Servers}
$Scan = {
param ($Servers)
Run_Scan1 $Servers
Run_Scan2 $Servers
}
Start-Job -ScriptBlock $Scan -ArgumentList $Servers
}
Function Run_Scan1 ($Servers){
scan code
}
Function Run_Scan2 ($Servers){
scan code
}
更新:
我能够做到以下几点:
$ServerList = "Serv1","Serv2","Serv3"
Start-Job -InitializationScript $Initialization -ScriptBlock {param($servers) echo $servers} -args (,$servers)
Receive-Job
输出:
Serv1
Serv2
Serv3
但是当我尝试合并调用函数时:
$Initialization = [scriptblock]::Create("Import-Module -Name 'Pathto\Functions.psm1'")
Start-Job -InitializationScript $Initialization -ScriptBlock {param($servers) Run_Scan1 $servers} -args (,$servers)
我收到以下错误:
术语 'Run_Scan1' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
无法索引到空数组。
最终解决方案:
Start-Job -InitializationScript {Import-Module "Pathto\Functions.ps1"} -ScriptBlock { param($Servers) Run_Scan1 $Servers } -ArgumentList (,$servers)
对于数组,我推荐使用范围。作业不能很好地处理数组参数。如果有,请使用 start-threadjob。
$servers = echo server1 server2
start-job { param($servers) $servers } -args $servers | receive-job -wait -auto
server1
start-job { $using:servers } | receive-job -wait -auto
server1
server2
或者有这个荒谬的 (, ) 解决方法:
start-job { param($servers) $servers } -args (,$servers) | receive-job -wait -auto
server1
server2
我有一个导入模块的主脚本 \path\to\functions.psm1, 我在主脚本中调用了一个名为:Run_Scans $ServerList 的函数,它来自 functions.psm1, 从 Run_Scans 我尝试使用 Start-Job 调用另外两个函数(Scan1、Scan2),但无法获取服务器变量以传递给其他函数。我已经尝试了几种不同的方法来处理作业失败或完成但服务器列表确实通过了。任何帮助将不胜感激。
#This is from the main script#
Import-Module "path\to\Functions.psm1"
Run_Scans $ServerList
#This is from functions.psm1#
Function Run_Scans ($Servers){
#Start-Job -Name 'Scan1' -ScriptBlock {Run_Scan1 $using:Servers}
#Start-Job -Name 'Scan2' -ScriptBlock {Run_Scan2 $using:Servers}
$Scan = {
param ($Servers)
Run_Scan1 $Servers
Run_Scan2 $Servers
}
Start-Job -ScriptBlock $Scan -ArgumentList $Servers
}
Function Run_Scan1 ($Servers){
scan code
}
Function Run_Scan2 ($Servers){
scan code
}
更新:
我能够做到以下几点:
$ServerList = "Serv1","Serv2","Serv3"
Start-Job -InitializationScript $Initialization -ScriptBlock {param($servers) echo $servers} -args (,$servers)
Receive-Job
输出:
Serv1
Serv2
Serv3
但是当我尝试合并调用函数时:
$Initialization = [scriptblock]::Create("Import-Module -Name 'Pathto\Functions.psm1'")
Start-Job -InitializationScript $Initialization -ScriptBlock {param($servers) Run_Scan1 $servers} -args (,$servers)
我收到以下错误:
术语 'Run_Scan1' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
无法索引到空数组。
最终解决方案:
Start-Job -InitializationScript {Import-Module "Pathto\Functions.ps1"} -ScriptBlock { param($Servers) Run_Scan1 $Servers } -ArgumentList (,$servers)
对于数组,我推荐使用范围。作业不能很好地处理数组参数。如果有,请使用 start-threadjob。
$servers = echo server1 server2
start-job { param($servers) $servers } -args $servers | receive-job -wait -auto
server1
start-job { $using:servers } | receive-job -wait -auto
server1
server2
或者有这个荒谬的 (, ) 解决方法:
start-job { param($servers) $servers } -args (,$servers) | receive-job -wait -auto
server1
server2