一些注意事项:
1、从SDK中使用到了两个方法
a. SearchDatastoreSubFloders_Task:在一个特定的datastore(数据存储)中查找所有的.VMX文件。
b.RegisterVM_Task:注册一个VMX文件
2、在常见的FAQ中RegisterVM_Task方法解答中:resourcepool是必须的。
3、客户机会被注册到一个特定的数据中心(datacenter)或者是集群中的一个数据中心。
4、客户机注册的文件夹将会隐藏一个文件夹"VM"
5、客户机注册的资源池也是隐藏的资源池"Resources"
6、被注册的名称与现有的重名,RegisterVM_Task方法将会失败。
7、*.VMX文件就是要注册的文件名,例如:PC1.vmx,就是客户机的PC1
$folder = Get-View (Get-Datacenter -Name <datacenter-name> | Get-Folder -Name "vm").ID
$pool = Get-View (Get-Cluster -Name <cluster-name> | Get-ResourcePool -Name "Resources").ID
$guestname = [regex]"^([\w]+).vmx"
$esxImpl = Get-VMHost -Name <VMHost-name>
$esx = Get-View $esxImpl.ID
$dsBrowser = Get-View $esx.DatastoreBrowser
foreach($dsImpl in $dsBrowser.Datastore){
$ds = Get-View $dsImpl
$vms = @()
foreach($vmImpl in $ds.Vm){
$vm = Get-View $vmImpl
$vms += $vm.Config.Files.VmPathName
}
$datastorepath = "[http://" + $ds.Summary.Name + "|http://" + $ds.Summary.Name + "]"
$searchspec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
$searchSpec.matchpattern = "*.vmx"
$taskMoRef = $dsBrowser.SearchDatastoreSubFolders_Task($datastorePath, $searchSpec)
$task = Get-View $taskMoRef
while ($task.Info.State -eq "running"){$task = Get-View $taskMoRef}
foreach ($file in $task.info.Result){
$found = $FALSE
foreach($vmx in $vms){
if(($file.FolderPath + $file.File[0].Path) -eq $vmx){
$found = $TRUE
}
}
if (-not $found){
$vmx = $file.FolderPath + $file.File[0].Path
$res = $file.File[0].Path -match $guestname
$folder.RegisterVM_Task($vmx,$matches[1],$FALSE,$pool.MoRef,$null)
}
}
}