PowerShell变量中包含变量

5

我正在尝试添加一个变量$numberOfNics,根据数量添加nics。目前这是我的代码,我有点困惑如何将其放入循环中。我知道数组可能是正确的方法,但不确定如何制作一个仅调用变量而不是设置变量的数组。

旧代码:

$numberOfNics=1

$networkname1 = "ondemandport1"
$networkname2 = "ondemandport2"
$networkname3 = "ondemandport3"
$networkname4 = "ondemandport4"
$networkname5 = "ondemandport5"
$networkname6 = "ondemandport6"
$networkname7 = "ondemandport7"
$networkname8 = "ondemandport8"
$networkname9 = "ondemandport9"

$networkInterface1 = New-AzureRmNetworkInterface -Name $networkname1

$networkInterface2 = New-AzureRmNetworkInterface -Name $networkname2 

$networkInterface3 = New-AzureRmNetworkInterface -Name $networkname3 

$networkInterface4 = New-AzureRmNetworkInterface -Name $networkname4 

$networkInterface5 = New-AzureRmNetworkInterface -Name $networkname5

为了整理这个,我想做一个循环,就像这样
for ($i = 0; $i -lt $numberOfNics; $i++)
{
    $networkInterface$i = New-AzureRmNetworkInterface -Name $networkname$i
}

编辑: 感谢马丁,但是我现在遇到了调用变量的问题。

$networkInterfaces = 1 .. $numberOfNics | ForEach-Object { 
if ($a -eq 0){
    New-AzureRmNetworkInterface -ResourceGroupName $resourceGroupName -Name "ondemandport$_" -Location $locationName -SubnetId $virtualNetwork.Subnets[$a].Id -PublicIpAddressId $publicIp.Id -force
    }
ElseIf ($a=1){
    New-AzureRmNetworkInterface -ResourceGroupName $resourceGroupName -Name "ondemandport$_" -Location $locationName -SubnetId $virtualNetwork.Subnets[$a].Id -force
    }
Else{
    New-AzureRmNetworkInterface -ResourceGroupName $resourceGroupName -Name "ondemandport$_" -Location $locationName -SubnetId $virtualNetwork.Subnets[2].Id -force 
    }

}

#也希望将其转换为数组循环

$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[1].Id -Primary
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[2].Id
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[3].Id
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[4].Id 
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[5].Id
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[6].Id
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[7].Id 
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[8].Id
$vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterfaces[9].Id

错误信息:Add-AzureRmVMNetworkInterface:无法验证参数“Id”。该参数为空。请提供一个非空的参数,然后再次尝试执行命令。
3个回答

3
您也可以只用一行代码实现此操作:
$networkInterfaces = 1 .. $numberOfNics | ForEach-Object { New-AzureRmNetworkInterface -Name "ondemandport$_" }

现在您可以通过索引访问接口,例如:
$networkInterfaces[2]

顺便提一下,可以考虑使用ARM模板代替。
编辑:
$networkInterfaces = 1 .. $numberOfNics | ForEach-Object { 

    $isPrimary = $_ -eq 0 # set the first one as primary

    $nic = Get-AzureRmNetworkInterface -Name "ondemandport$_" -ResourceGroupName $resourceGroupName
    Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id -Primary:$isPrimary
}

谢谢Martin,这个一行代码很好用,我已经加入到我的代码中了。但是现在当我调用变量时出现了错误。我已经编辑了原帖以展示我遇到的错误。 - doggydogworld
@doggydogworld 第一个接口的索引是0,你可能超出了范围?不过,你可以尝试使用 Get-AzureRemNetworkInterface 命令来检索 nic,参见我的编辑答案。 - Martin Brandl

0
你应该能够做到这样:
$numberOfNics= 10
$networkname = "ondemandport"

$networkInterface = @()

for ($i = 0; $i -le $numberOfNics; $i++)
{
    $networkInterface += ,@( New-AzureRmNetworkInterface -Name ($networkname + $i ))
}

不确定它是否适用于New-AzureRmNetworkInterface,但适用于其他New-命令


0
您可以使用PowerShell的Get-Variable命令。我想要指出的一件事是,您正在使用的for循环不会限制到$numberOfNics,实际上,它的长度将取决于$networkname变量。例如,您有从$networkname1$networkname9networkname变量,因此您的循环将如下所示-
$NetworkInfo = @()
for($i = 1; $i -le 9; $i++) {$NetworkInfo += Get-Variable("networkname" + $i)}

现在$NetworkInfo已经有了

Name                           Value
----                           -----
networkname1                   ondemandport1
networkname2                   ondemandport2
networkname3                   ondemandport3
networkname4                   ondemandport4
networkname5                   ondemandport5
networkname6                   ondemandport6
networkname7                   ondemandport7
networkname8                   ondemandport8
networkname9                   ondemandport9

您可以像这样放置另一个for循环 -

$NetworkInterface = @()
for ($i = 0; $i -lt $NetworkInfo.Length; $i++)
{
    $NetworkInterface +=  New-AzureRmNetworkInterface -Name $NetworkInfo.Value[$i]
}

接下来,可以通过$NetworkInterface [0],$NetworkInterface [1]等方式访问单个元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接