New-PSSession并行执行
New-PSSession Parellel Execution
在我们的脚本可以继续之前,我们有两个 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 秒。我会很高兴完成这个的任何答案,它不需要使用 运行spaces.
编辑:添加目标
感谢@ShankarShastri 为我们指明了正确的方向。 New-PSSession commandlet 支持将 URI 或计算机名称数组作为输入。我有服务器来测试而不是 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 次,而 运行ning New-PSSession 一次并提供 7 个计算机名称。差异快了大约 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
在我们的脚本可以继续之前,我们有两个 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 秒。我会很高兴完成这个的任何答案,它不需要使用 运行spaces.
编辑:添加目标
感谢@ShankarShastri 为我们指明了正确的方向。 New-PSSession commandlet 支持将 URI 或计算机名称数组作为输入。我有服务器来测试而不是 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 次,而 运行ning New-PSSession 一次并提供 7 个计算机名称。差异快了大约 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