Net View с использованием Runspace в Powershell - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время передо мной стоит задача включить сценарий (который принимает несколько компьютеров и перечисляет общие ресурсы на каждом компьютере) для работы с несколькими потоками с использованием 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()
...