我对脚本很新,但我无法在任何地方找到这个问题的答案。可能是因为我不知道用来表达问题的正确术语。请原谅我的经验不足并忍受我..
在我的脚本开头,我根据用户输入创建了一组计算机名称:
$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的元素,所以它似乎不起作用。我想删除没有连接的主机,因此脚本的其余部分不会浪费时间尝试每次连接它们。
感谢您未来的答案,我很高兴最终成为社区的一员!
答案 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')