环境中有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 }
$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
function Get-VmList
从文件中获取vm列
$vmSession = New-PSSession -ComputerName $vm -Credential $adminCredential -ErrorAction SilentlyContinue
创建pssession,当创建失败时,不在控制台显示错误消息并继续执行