我有两个数组。
一个包含虚拟机信息的对象数组称为 $vms
,其中一个属性叫做 Name
。这是它的类型:
PowerCLI > $vms.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
我有另一个从CSV文件导入的数组,名为$importVMs
,其中一个字段也称为Name
。
如果$importVMs.Name
在$vms
中不存在(即它不匹配任何$vms.Name
),我想做一些工作。我想知道我是否可以通过管道处理来实现此操作,还是必须遍历这两个数组?
我能否做出类似于以下的事情:if (! $vms | ? {$_.Name -neq $importVms.Name) { # work }
似乎无法让其正常工作。在该if
条件中,我需要对$importVms
进行foreach
操作吗?
编辑
到目前为止,我的完整脚本:
Connect-VIServer -Server vCenter -Protocol https -Force | out-null
$importVms = Import-Csv vCenterVMs.csv
$VMHost = "esxi"
$currentVms = Get-VM
Write-Host "Current registered VMs" -ForeGroundColor Cyan
$currentVMs
Write-Host "Saved VMs to import" -ForeGroundColor Yellow
$importVms
$registered = @()
Write-Host "Importing VMs..." -ForeGroundColor White
#$importVms | ?{$_.Name -notcontains $currentVms}
foreach ($vm in $importVms) {
if (! $currentVms.Name -contains $vm) {
Write-Host "Importing $($vm.Name)"
# put in a try block here
$registeredVM = New-VM -VMFilePath $vm.VmPathName -VMHost $VMHost -Location $vm.Location
$registeredList += $registeredVM.Name
}
}
$registeredList
Disconnect-VIServer -Server * -Confirm:$false
vCenterVMs.csv的样子
"Name","VmPathName","Location"
"test","[RAID5] test/test.vmx","testfolder"
-notcontains
总是会产生正匹配,而实际上并不应该这样。 - Mark Allisonif
语句更改为if ($vm.Name -notmatch $VMNameFilter)
才能使其正常工作。 - Mark Allison