我对脚本很陌生,但我在任何地方都找不到这个问题的答案。这可能是因为我不知道用什么正确的术语来表达这个问题。请原谅我的经验不足,并耐心等待我。
在我的脚本开始时,我根据用户输入创建一个计算机名称数组:
$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-Object
cmdlet 将数组拆分为可以连接和无法连接的数组:
$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')