如何在Powershell中的循环内创建一堆数组
how to create bunch of arrays inside a loop in powershell
我正在编写一个脚本来获取一组组件的值并将获取的值存储在一个数组中。由于有很多组件,我创建了一个循环并尝试创建一个数组名称及其迭代值(fi1、fi2、fi3 等),如下所示。
代码如下:
function fiswitchinfo {
Param ($sheet, [string]$text, $iter)
$($fi+($iter)) = @()
$max = $sheet.UsedRange.Rows.Count
for ($i=1; $i -lt 900 ; $i++) {
$rows = $sheet.Cells.Item($i, 2).EntireRow
$cell_info = $sheet.Cells.Item($i, 2)
$cell = $cell_info.Address($false, $false)
if ($rows.hidden -eq $false) {
$cell_info = $sheet.Cells.Item($i, 2).Text
if ($cell_info -ne "" -and $cell_info.Contains($text) -eq "True") {
$cell = $cell -split "(?<=[A-Z])(?=\d)"
[int]$curline = $cell[1]
$component = $sheet.Cells.Item($curline, 2).Text
$compip = $sheet.Cells.Item($curline, 3).Text
$row = $sheet.Cells.Item($curline, 2).EntireRow
$cellinfo = $sheet.Cells.Item($curline, 2).text
if ($row.Hidden -ne "True" -and $cellinfo -ne $null) {
Write-Host $component $compip
$script:fi+$iter += $compip
}
}
}
}
}
fiswitchinfo $worksheet_3 "Fabric Interconnect 01 Cluster IP" 1
fiswitchinfo $worksheet_3 "Fabric Interconnect 01 A" 1
fiswitchinfo $worksheet_3 "Fabric Interconnect 01 B" 1
我不太确定您期望 $($fi+($iter))
或 $script:fi+$iter
做什么,但我很确定他们不会做您期望的任何事情。
要让一个函数在一个循环中创建一个数组数组,然后 return 它你会做这样的事情:
function fiswitchinfo {
...
$arr = @()
for ($i=1; $i -lt 900 ; $i++) {
...
$arr += ,$compip
}
return ,$arr
}
$fi1 = fiswitchinfo ...
$fi2 = fiswitchinfo ...
...
语句 $arr += ,$compip
和 return ,$arr
中的前导逗号是一元数组构造运算符,可防止 PowerShell 展开数组。 $arr += ,$compip
将 $compip
附加到 $arr
作为嵌套数组(因此使 $arr
成为锯齿状数组)而不是将 $compip
的元素附加到 $arr
. return ,$arr
确保 $arr
按原样 returned 给调用者(因此即使数组为空也能保留数组)。
我正在编写一个脚本来获取一组组件的值并将获取的值存储在一个数组中。由于有很多组件,我创建了一个循环并尝试创建一个数组名称及其迭代值(fi1、fi2、fi3 等),如下所示。
代码如下:
function fiswitchinfo {
Param ($sheet, [string]$text, $iter)
$($fi+($iter)) = @()
$max = $sheet.UsedRange.Rows.Count
for ($i=1; $i -lt 900 ; $i++) {
$rows = $sheet.Cells.Item($i, 2).EntireRow
$cell_info = $sheet.Cells.Item($i, 2)
$cell = $cell_info.Address($false, $false)
if ($rows.hidden -eq $false) {
$cell_info = $sheet.Cells.Item($i, 2).Text
if ($cell_info -ne "" -and $cell_info.Contains($text) -eq "True") {
$cell = $cell -split "(?<=[A-Z])(?=\d)"
[int]$curline = $cell[1]
$component = $sheet.Cells.Item($curline, 2).Text
$compip = $sheet.Cells.Item($curline, 3).Text
$row = $sheet.Cells.Item($curline, 2).EntireRow
$cellinfo = $sheet.Cells.Item($curline, 2).text
if ($row.Hidden -ne "True" -and $cellinfo -ne $null) {
Write-Host $component $compip
$script:fi+$iter += $compip
}
}
}
}
}
fiswitchinfo $worksheet_3 "Fabric Interconnect 01 Cluster IP" 1
fiswitchinfo $worksheet_3 "Fabric Interconnect 01 A" 1
fiswitchinfo $worksheet_3 "Fabric Interconnect 01 B" 1
我不太确定您期望 $($fi+($iter))
或 $script:fi+$iter
做什么,但我很确定他们不会做您期望的任何事情。
要让一个函数在一个循环中创建一个数组数组,然后 return 它你会做这样的事情:
function fiswitchinfo {
...
$arr = @()
for ($i=1; $i -lt 900 ; $i++) {
...
$arr += ,$compip
}
return ,$arr
}
$fi1 = fiswitchinfo ...
$fi2 = fiswitchinfo ...
...
语句 $arr += ,$compip
和 return ,$arr
中的前导逗号是一元数组构造运算符,可防止 PowerShell 展开数组。 $arr += ,$compip
将 $compip
附加到 $arr
作为嵌套数组(因此使 $arr
成为锯齿状数组)而不是将 $compip
的元素附加到 $arr
. return ,$arr
确保 $arr
按原样 returned 给调用者(因此即使数组为空也能保留数组)。