在Powershell中使用Runspace进行Net View

时间:2018-11-01 15:09:55

标签: powershell parallel-processing network-programming runspace

我目前面临的挑战是尝试使脚本(使用多台计算机并列出每台计算机上的共享)使用运行空间与多个线程一起运行。我的共享查询是使用NET VIEW完成的,我这部分代码可以完美地用作按顺序运行的现有脚本的一部分。

但是,当我扫描整个公司域时,并行查询才有意义。 在查看了一些wiki之后,我找到了下面的代码,但是这似乎可以执行并挂起。我对代码进行了修改,没有明显的成功。 我的一小部分机器处于在线状态,因为我需要事先进行测试以验证这一点。

这是我第一次尝试在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()

0 个答案:

没有答案