我对脚本编程非常陌生,但我在任何地方都找不到这个问题的答案。这可能是因为我不知道如何用正确的字眼来表达问题。请原谅我的缺乏经验,请容忍我..
在脚本的开头,我根据用户输入创建了一个计算机名称数组:
$computerarray = @()
do {
$ComputerName = (Read-Host "Please enter the computer name")
if ($Computername -ne '') {$computerarray += $Computername}
}
until ($Computername -eq '')我在foreach循环中使用整个脚本中的数组变量,并使用$ComputerName变量调用每个数组元素。
在我定义了$computerarray之后,我测试每个主机的连接,以确定哪些主机是在线的,我的目标是消除无法连接的主机。经过一些研究,我发现普通的数组元素不能被删除,但是ArrayLists可以被修改,并允许元素移动到另一个数组。
在了解到这一点后,我修改了我的初始代码,将set $computerarray设置为数组列表:
[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引用元素,所以它似乎不起作用。我想删除未连接的主机,这样脚本的其余部分就不会浪费时间尝试每次连接到它们。
感谢你未来的回答,我很高兴终于成为社区的一部分!
发布于 2018-05-16 00:08:35
您可以使用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')https://stackoverflow.com/questions/50354484
复制相似问题