将for循环的变量插入另一个变量名

时间:2019-09-04 03:23:20

标签: powershell for-loop variables indirection

我正在尝试简化我的同事所做的Windows接口脚本,在该脚本中他使用了很多if循环,我认为可以使用for循环将其进一步缩短。

基本上,我们有几台计算机,每台计算机的范围为4-12,并且我们为每个管理员提供一个界面来还原其各自的快照。

我正在用for循环中的$ i值替换每个变量中的数字。

我尝试使用数组和哈希表,但是根据我收集到的数据,它们更适合存储值,而不适合存储包含其他变量的公式。

if($ComputerNumber -eq 4) {
   $checkBoxComputer1LocX = $leftMargin
   $checkBoxComputer1LocY = [int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding

   $checkBoxComputer2LocX = $leftMargin
   $checkBoxComputer2LocY = [int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding + (1 * ([int]$checkBoxHeight + [int]$padding))

   $checkBoxComputer3LocX = $leftMargin
   $checkBoxComputer3LocY = [int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding + (2 * ([int]$checkBoxHeight + [int]$padding))

   $checkBoxComputer4LocX = $leftMargin
   $checkBoxComputer4LocY = [int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding + (3 * ([int]$checkBoxHeight + [int]$padding))
}

这是我要实现的目标:

for($i=1; $i -le $ComputerNumber; i++) {
   $checkBoxComputer$iLocX = $leftMargin
   $checkBOxComputer$iLocY = [int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding + (($i - 0) * ([int]$checkBoxHeight + [int]padding))
}

1 个答案:

答案 0 :(得分:1)

要使用变量间接寻址(通过存储在另一个变量中的变量名称来引用)进行分配请使用Set-Variable (对于检索,您可以使用Get-Variable):

for($i=1; $i -le $ComputerNumber; i++) {
  Set-Variable -Name checkBoxComputer${i}LocX -Value $leftMargin
  Set-Variable -Name checkBoxComputer${i}LocY -Value ([int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding + (($i - 0) * ([int]$checkBoxHeight + [int]padding)))
}

请注意,变量$i的名称如何用{...}${i})括起来,以便清楚地描绘它的名称,以便不将后续字符视为名称的一部分。


但是,您绝对可以使用 arrays 自定义对象代替单个变量,这是更可取的:

[array] $checkBoxes = for($i=1; $i -le $ComputerNumber; i++) {
  [pscustomobject] @{ 
     LocX = $leftMargin
     LocY= [int]$labelSubHeaderLocY + [int]$buttonHeight + [int]$padding + (($i - 0) * ([int]$checkBoxHeight + [int]padding))
  }
}

上面的代码创建了一个(基于0索引)的自定义对象数组,每个对象都有一个.LocX.LocY属性,因此,例如,您可以访问第一个复选框的.LocX值,如下所示:

$checkBoxes[0].LocX
相关问题