首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Read-Host创建数组元素,如何使用情景数组变量将元素移动到另一个ArrayList?

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

Stack Overflow用户
提问于 2018-05-15 23:53:38
回答 1查看 502关注 0票数 0

我对脚本编程非常陌生,但我在任何地方都找不到这个问题的答案。这可能是因为我不知道如何用正确的字眼来表达问题。请原谅我的缺乏经验,请容忍我..

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

代码语言:javascript
复制
$computerarray = @()
do {
 $ComputerName = (Read-Host "Please enter the computer name")
 if ($Computername -ne '') {$computerarray += $Computername}
}
until ($Computername -eq '')

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

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

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

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

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

代码语言:javascript
复制
$ComputersToDelete = @()

然后运行Test-Connection块:

代码语言:javascript
复制
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数组中:

代码语言:javascript
复制
$ComputersToDelete += $computerarray.$Computername

最后,我在这一块后面写道:

代码语言:javascript
复制
foreach ($ComputersToDelete in $ComputersToDelete) {
  $ComputersToDelete.Delete()
}

我读过,要移动数组元素,它应该是这样的:

代码语言:javascript
复制
$ComputersToDelete += $computerarray[1]

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-16 00:08:35

您可以使用Group-Object cmdlet将阵列拆分为可以连接和不能连接的阵列:

代码语言:javascript
复制
$Computers = $computerArray |Group-Object { Test-Connection -ComputerName $_ -ErrorAction SilentlyContinue } -AsHashtable

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

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

代码语言:javascript
复制
$ToKeep,$ToDelete = $computerArray.Where({Test-Connection $_ -Count 1 -Quiet},'Split')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50354484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档