通过 Read-Host 创建数组元素,如何使用情境数组变量将元素移动到另一个 ArrayList?



我对脚本很陌生,但我在任何地方都找不到这个问题的答案。这可能是因为我不知道用什么正确的术语来表达这个问题。请原谅我的经验不足,并耐心等待我。

在我的脚本开始时,我根据用户输入创建一个计算机名称数组:

$computerarray = @()
do {
$ComputerName = (Read-Host "Please enter the computer name")
if ($Computername -ne '') {$computerarray += $Computername}
}
until ($Computername -eq '')

我在 foreach 循环中使用整个脚本中的数组变量,使用 $ComputerName 变量来调用每个数组元素。

定义$computerarray后,我为每个主机测试连接以确定哪些主机处于联机状态,我的目标是摆脱无法连接的主机。经过一些研究,我发现普通数组元素不能删除,但 ArrayList 可以修改并允许元素移动到另一个数组。

了解了这一点后,我修改了我的初始代码以将 set $computerarray 设置为数组列表:

[System.Collections.ArrayList]$computerarray = @()
do {
$ComputerName = (Read-Host "Please enter the computer name")
if ($Computername -ne '') {$computerarray += $Computername}
}
until ($Computername -eq '')

然后创建另一个阵列列表以移动未连接的主机,

$ComputersToDelete = @()

然后运行测试连接块:

foreach ($Computername in $computerarray) 
{
If (Test-Connection -computername $ComputerName -ErrorAction SilentlyContinue)
{
Write-Host "`nConnected to $Computername"
} 
Else 
{
Write-Host "`nCannot connect to $Computername" -forgroundcolor white -BackgroundColor red

在最后一个块的 else 部分中,我尝试将选定的$ComputerName移动到此处的$ComputersToDelete数组中:

$ComputersToDelete += $computerarray.$Computername

最后,我遵循此块:

foreach ($ComputersToDelete in $ComputersToDelete) {
$ComputersToDelete.Delete()
}

我已经读到移动数组元素,它会像这样:

$ComputersToDelete += $computerarray[1]

但是,由于我只引用$ComputerNames元素,因此它似乎不起作用。我想删除未连接的主机,以便脚本的其余部分不会浪费时间每次尝试连接到它们。

感谢您未来的回答,我很高兴终于成为社区的一员!

可以使用Group-Objectcmdlet 将数组拆分为可以连接和无法连接的数组:

$Computers = $computerArray |Group-Object { Test-Connection -ComputerName $_ -ErrorAction SilentlyContinue } -AsHashtable
$ToKeep    = $Computers[$true]
$ToDelete  = $Computers[$false]

或者(在 PowerShell 4.0 及更高版本中),在Split模式下使用.Where()方法:

$ToKeep,$ToDelete = $computerArray.Where({Test-Connection $_ -Count 1 -Quiet},'Split')

最新更新