В настоящее время передо мной стоит задача включить сценарий (который принимает несколько компьютеров и перечисляет общие ресурсы на каждом компьютере) для работы с несколькими потоками с использованием Runspace. Мой запрос на обмен выполняется с помощью NET VIEW, эта часть моего кода прекрасно работает как часть моего существующего сценария, который выполняется последовательно.
Однако, поскольку я сканирую весь корпоративный домен, параллельные запросы имеют смысл.
Посмотрев несколько вики, я получаю приведенный ниже код, однако, похоже, он выполняется и просто зависает. Я возился с кодом без видимого успеха.
Мой маленький образец машин подключен к сети, и я проверяю тест перед этим, чтобы убедиться в этом.
Это моя первая попытка в Runspace, я действительно не уверен, куда иду не так, и был бы очень признателен за помощь.
Спасибо
$computers = @('computer1','computer2','computer3','computer4','computer5')
$pool = [RunspaceFactory]::CreateRunspacePool(1, 50)
$pool.ApartmentState = "MTA"
$pool.open()
$runspaces = @()
$scriptblock = {
param([string]$m)
Write-Host $computers.Length
$pattern = [regex]"(.+)\s+(Disk)"
$shares_array = New-Object System.Collections.ArrayList
$shares = net view $m | foreach {
if ($_ -match $pattern)
{
$b = "\\$m\$($matches[1])"
$shares_array.Add($b)
}
}}
ForEach($m in $computers) {
$runspace = [PowerShell]::Create()
$null = $runspace.AddScript($scriptblock)
$null = $runspace.AddArgument($m)
$runspaces += [PSCustomObject]@{ Pipe = $runspace; Status = $runspace.BeginInvoke() }
}
while ($runspaces.Status -ne $null)
{
$completed = $runspaces | Where-Object { $_.Status.IsCompleted -eq $true }
foreach ($runspace in $completed)
{
$runspace.Pipe.EndInvoke($runspace.Status)
$runspace.Status = $null
}
}
$pool.Close()
$pool.Dispose()