新PSSession Parellel执行

时间:2016-09-14 13:35:00

标签: powershell powershell-remoting runspace

在我们的脚本可以继续之前,我们需要建立两个PSSession并将其导入当前会话。这两个步骤分别需要大约10 - 15秒,连续运行时总共需要20 - 30秒。

是否可以在单独的运行空间中运行New-PSSession,然后以某种方式将已建立的会话导入父进程?

例如,改变:

New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri ("https://$($service)/PowerShell/") -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop

New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop

可能是这样的(警告这不起作用):

$credential = Get-Credential

$scriptblock = 
{
       param ([string]$Credential)

       $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop
       return $session
}


$shell = [PowerShell]::Create().AddScript($scriptblock).AddParameter($credential)

$job = $shell.BeginInvoke()
$result = $shell.EndInvoke($job)

Import-PSSession $result

最终目标是让这花费更少的时间,我们的想法是,如果我们并行使用New-PSSession,它将在10-15秒内完成,而不是20-30秒。我对任何完成此任务的答案感到满意,并不需要使用运行空间。

编辑:添加了目标

1 个答案:

答案 0 :(得分:2)

归功于@ShankarShastri指出我们正确的方向。 New-PSSession命令行开关支持将URI或ComputerNames数组作为输入。我有服务器来测试而不是URI,但看看这个:

$cred = Get-Credential DOMAIN\user

$servers = 
"server1.domain.company.com",
"server2.domain.company.com",
"server3.domain.company.com",
"server4.domain.company.com",
"server5.domain.company.com",
"server6.domain.company.com",
"server7.domain.company.com"

(Measure-Command {
    foreach($s in $servers) { $temp = New-PSSession -ComputerName $s -Authentication Negotiate -Credential $cred }
}).TotalSeconds

# 2.987739

(Measure-Command {
    $s1, $s2, $s3, $s4, $s5, $s6, $s7 = New-PSSession -ComputerName $servers -Authentication Negotiate -Credential $cred
}).TotalSeconds

# 0.5793281

这显示New-PSSession运行7次,而不是运行New-PSSession一次并提供7个ComputerNames。差异大约快6倍,这意味着连接是异步的。

因此,在您的情况下,您可以通过运行以下内容来完成您想要的任务:

$sessions1, $sessions2 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri ("https://$($service)/PowerShell/"),"https://outlook.office365.com/powershell-liveid/" -Credential $Credential -Authentication Basic -AllowRedirection -ErrorAction Stop