gpt4 book ai didi

powershell - 如何搜索包含另一个数组中的项目的对象数组?

转载 作者:行者123 更新时间:2023-12-05 00:25:05 26 4
gpt4 key购买 nike

我有两个数组。

包含名为 $vms 的虚拟机信息的对象数组名为 Name 的属性之一.这是类型:

PowerCLI > $vms.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

我有另一个从名为 $importVMs 的 CSV 文件导入的数组其中一个字段也称为 Name .

如果 $importVMs.Name 我想做点工作不存在于 $vms (即它不匹配任何 $vms.Name )。我想知道我是否可以通过流水线来做到这一点,还是我必须遍历两个数组?

我可以做类似 if (! $vms | ? {$_.Name -neq $importVms.Name) { # work } 的事情吗?

似乎无法让它工作。我需要 foreach $importVms在那 if健康)状况?

编辑

到目前为止我的完整脚本:
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"

最佳答案

为此使用 -notin 或 -notcontains 运算符。

$importvms | ?{$_.Name -notin $vms.name} | %{ Do Stuff }

别名 ?用于 Where , 和 %用于 ForEach .

好的,这不起作用我们可以尝试从当前 VM 名称的数组中构建一个正则表达式匹配字符串,并将每个导入的 VM 与其匹配以查看它是否已经存在。试试这个脚本:
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}

$VMNameFilter = "($(($currentVms|%{[RegEx]::Escape($_.Name)}) -join "|"))"

foreach ($vm in $importVms) {
if (! $vm.Name -match $VMNameFilter) {
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

关于powershell - 如何搜索包含另一个数组中的项目的对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25084484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com