main方法启动job的shell脚本_powershell – 使用Start-Job同时运行多个脚本块(而不是循环)...

由于您的循环只需要使用字符串,因此很容易将其转换为并发脚本.

下面是一个使循环使用后台作业来加速处理的示例.

代码将循环遍历数组并启动后台作业以运行脚本块$sb中的代码. $maxJobs变量控制一次运行的作业数,$chunkSize变量控制每个后台作业将处理的服务器数.

在脚本块中添加其余处理,添加要返回到PsObject的任何其他属性.

$sb = {

$serverInfos = @()

$args | % {

$IPAddress = [Net.Dns]::GetHostAddresses($_) | select -expand IPAddressToString

# More processing here...

$serverInfos += New-Object -TypeName PsObject -Property @{ IPAddress = $IPAddress }

}

return $serverInfos

}

[string[]] $servers = Get-QADComputer -sizelimit 500 -WarningAction SilentlyContinue -OSName *server*,*hyper* | Select -Expand Name

$maxJobs = 10 # Max concurrent running jobs.

$chunkSize = 5 # Number of servers to process in a job.

$jobs = @()

# Process server list.

for ($i = 0 ; $i -le $servers.Count ; $i+=($chunkSize)) {

if ($servers.Count - $i -le $chunkSize)

{ $c = $servers.Count - $i } else { $c = $chunkSize }

$c-- # Array is 0 indexed.

# Spin up job.

$jobs += Start-Job -ScriptBlock $sb -ArgumentList ( $servers[($i)..($i+$c)] )

$running = @($jobs | ? {$_.State -eq 'Running'})

# Throttle jobs.

while ($running.Count -ge $maxJobs) {

$finished = Wait-Job -Job $jobs -Any

$running = @($jobs | ? {$_.State -eq 'Running'})

}

}

# Wait for remaining.

Wait-Job -Job $jobs > $null

$jobs | Receive-Job | Select IPAddress

以下是每个作业处理单个服务器的版本:

$servers = Get-QADComputer -WarningAction SilentlyContinue -OSName *server*,*hyper*

# Create list

$serverlist = @()

$sb = {

param ([string] $ServerName)

try {

# Fetch IP

$ipaddress = [System.Net.Dns]::GetHostAddresses($ServerName)| select-object IPAddressToString -expandproperty IPAddressToString

# Gather OSName through WMI

$OSName = (Get-WmiObject Win32_OperatingSystem -ComputerName $ServerName ).caption

# Ping the server

if (Test-Connection -ComputerName $ServerName -count 1 -Quiet ) {

$reachable = "Yes"

}

# Save info about server

$serverInfo = New-Object -TypeName PSObject -Property @{

SystemName = ($ServerName).ToLower()

IPAddress = $IPAddress

OSName = $OSName

}

return $serverInfo

} catch {

throw 'Failed to process server named {0}. The error was "{1}".' -f $ServerName, $_

}

}

# Loop servers

$max = 5

$jobs = @()

foreach($server in $servers) {

$jobs += Start-Job -ScriptBlock $sb -ArgumentList $server.Name

$running = @($jobs | ? {$_.State -eq 'Running'})

# Throttle jobs.

while ($running.Count -ge $max) {

$finished = Wait-Job -Job $jobs -Any

$running = @($jobs | ? {$_.State -eq 'Running'})

}

}

# Wait for remaining.

Wait-Job -Job $jobs > $null

# Check for failed jobs.

$failed = @($jobs | ? {$_.State -eq 'Failed'})

if ($failed.Count -gt 0) {

$failed | % {

$_.ChildJobs[0].JobStateInfo.Reason.Message

}

}

# Collect job data.

$jobs | % {

$serverlist += $_ | Receive-Job | Select-Object SystemName,IPAddress,OSName

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值