Powershell:如何在循环中逐步放大变量?

时间:2019-02-16 22:51:53

标签: powershell yaml powercli

我是脚本编写/ PowerShell / PowerCLI的新手。我的任务是弄清楚如何最好地完成一些现有脚本的扩展。

我们从最终用户那里获取YAML输入的脚本,并根据其规范构建VMware ESXi群集。我们正在尝试扩展脚本,以便我们可以根据用户在YAML中指定的群集类型来应用不同的配置。我们希望最终用户能够扩展它以创建所需数量的集群。始终根据输入的集群类型应用不同的配置。我们还希望将来能够轻松扩展“最终定义”的其他类型的集群“ X”类型。

YAML输入示例:

Cluster1: <Name>
Cluster1Type: <Basic, DR, or Replicate>
Cluster2: <Name>
Cluster2Type: <Basic, DR, or Replicate>

我知道我可以用相当不干净的方式对很长的if和语句进行硬编码。像这样:

If ($Cluster1Type -eq 'DR') {<Code to execute on $Cluster1>}
ElseIf ($Cluster1Type -eq 'Replicate') {<Code to execute on $Cluster1>}
Else {<Code to execute on $Cluster1>}

If ($Cluster2Type -eq 'DR') {<Code to execute on $Cluster2>}
ElseIf ($Cluster2Type -eq 'Replicate') {<Code to execute on $Cluster2>}
Else {<Code to execute on $Cluster2>}

我知道必须有一个更好的方法来解决这个问题。如果我没记错的话,vSphere 6.5每个vCenter最多可以有64个群集,当然,绝对不想在每次我们需要检查最终用户为特定群集名称分配的群集类型时对64条else语句进行硬编码。我一直在寻找一个干净的解决方案,但是我的经验不足使我很难独自找到答案。

我还认为可能对集群名称使用可变数组,然后提示执行PowerShell脚本的用户为输入到数组中的每个集群名称输入集群类型。我仍然认为有比这更好的方法了吗?可能是一种在增量方法中对每个ClusterX和ClusterXType变量运行循环的方法吗?

3 个答案:

答案 0 :(得分:1)

您是在说这样的话吗? 这是假设用户一次只能输入一种群集类型。

# Specify the number of cluster nodes to create
$ClusterCount = Read-Host -Prompt 'Enter the number of guests to create'

# Enter a cluster type to create
$ClusterType = Read-Host -Prompt 'Enter the type - Basic, DR, Replicate'

1..$ClusterCount | 
ForEach{
    "Working cluster type $ClusterType on new node name Cluster$PSITEM"
    <#
    If ($ClusterType -eq 'DR') {"Code to execute on Cluster$PSItem"}
    ElseIf ($ClusterType -eq 'Replicate') {"Code to execute on Cluster$PSItem"}
    Else {<Code to execute on $Cluster1>}
    #>
}

# Results

Enter the number of guests to create: 3
Enter the type - Basic, DR, Replicate: Basic
Working cluster type Basic on new node name Cluster1
Working cluster type Basic on new node name Cluster2
Working cluster type Basic on new node name Cluster3

答案 1 :(得分:0)

您可以使用New-Variable命令创建一个变量,该变量使用另一个变量作为名称

$iteration = 1
New-Variable -Name Cluster$iteration

这将创建一个名为$Cluster1

的变量
Get-Variable C*

Name          Value
----          ----
Cluster1

答案 2 :(得分:0)

相反,我们最终在YAML中创建了一个对象数组。然后将YAML导入到我们的脚本中,并通过Clusters.Name / Clusters.Type进行调用。感谢您的帮助,每个人都一定会让我学习完成此任务或类似任务的各种方法。

集群:  -名称:XXXXX    类型:XXXXX