Powershell中使用New-PSSession判断VM的PSSession

环境中有800台VM,需要分别对其进行相关操作。在800台VM开机后,并不是每台VM都可以通过在控制台执行Enter-PSSession命令,立刻创建Session的。

估计是短时间内服务器负荷过高造成的。

等各个VM的系统中跟PSSession相关服务完全启动后,便可以使用Enter-PSSession命令创建Session。

问题是我不可能手动的在控制台中使用Enter-PSSession去测试Session是否可以被创建。

我尝试在脚本中使用Enter-PSSession命令去远程控制VM,然后再Remove-PSSession。

1 $sessionResult = Enter-PSSession $vm
2 if($vmSession -eq $null) {
3     Write-Host $vm"'s session does not exist."
4 }
5 else{
6     Exit-PSSession
7 }
View Code

$vm的相关服务未启动之前,$vmSession的值的确为$null,但启动之后,$vmSession -eq $null的结果认为真,且在这个时候,调试脚本的用断点完全不起作用,无法查看此时vmSession的值。

在网上搜索相关内容后,发现Enter-PSSession适用于控制台,而不是脚本中,于是为了解放双手,我便写了以下代码:

 1 $script:localDir = Split-Path -Parent $MyInvocation.MyCommand.Path
 2 
 3 function Test-PSSession
 4 {
 5     $password = "Passw0rd"
 6     $admin = "domain\administrator"
 7     $securePassword = ConvertTo-SecureString -AsPlainText -String $password -Force
 8     $adminCredential = New-Object system.Management.Automation.PSCredential($admin,$securePassword)
 9     
10     $vmlist = Get-VmList
11     $noSessionCount = 0
12     foreach($vm in $vmlist)
13     {
14         $vmSession = New-PSSession -ComputerName $vm -Credential $adminCredential -ErrorAction SilentlyContinue
15         if($vmSession -eq $null)
16         {
17             Write-Host $vm"'s session does not exist."
18             $noSessionCount++
19         }
20         else
21         {
22             Remove-PSSession $vmSession
23         }
24     }
25     Write-Host "Total VM:"$vmlist.Count
26     Write-Host "No PSSession:"$noSessionCount
27 }
28 
29 function Get-VmList
30 {
31     $list = @(Get-Content -Path ($script:localDir + "\VMList.txt"))
32     return $list
33 }
34 
35 Test-PSSession
View Code

function Get-VmList

  从文件中获取vm列

$vmSession = New-PSSession -ComputerName $vm -Credential $adminCredential -ErrorAction SilentlyContinue

  创建pssession,当创建失败时,不在控制台显示错误消息并继续执行

 

 

posted @ 2013-10-11 13:44  大心臟  阅读(1790)  评论(0编辑  收藏  举报