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

时间:2018-05-15 15:53:38

标签: arrays powershell

我对脚本很新,但我无法在任何地方找到这个问题的答案。可能是因为我不知道用来表达问题的正确术语。请原谅我的经验不足并忍受我..

在我的脚本开头,我根据用户输入创建了一组计算机名称:

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

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

在我定义了$ computerarray后,我为每个主机确定了Test-Connection,以确定哪些主机在线,我的目标是摆脱无法连接的主机。经过一些研究后,我发现无法删除普通的数组元素,但可以修改ArrayLists并允许元素移动到另一个数组。

在得知这个之后,我修改了我的初始代码,将set $ computerarray设置为arraylist:

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

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

$ComputersToDelete = @()

然后运行Test-Connection块:

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的元素,所以它似乎不起作用。我想删除没有连接的主机,因此脚本的其余部分不会浪费时间尝试每次连接它们。

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

1 个答案:

答案 0 :(得分:1)

您可以使用Group-Object cmdlet将阵列拆分为可以连接且无法连接的阵列:

$Computers = $computerArray |Group-Object { Test-Connection -ComputerName $_ -ErrorAction SilentlyContinue } -AsHashtable

$ToKeep    = $Computers[$true]
$ToDelete  = $Computers[$false]

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

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