在PowerShell中从动态字符串数组中删除项目

3
我正在尝试从字符串数组中删除一个项目。这是一个包含5个服务器名称的数组,我对数组中的每个服务器运行重新启动函数。我一次只能重启5个服务器,因此数组永远不会变得比这更大,但同时我希望继续向数组中添加服务器,以便可以循环遍历我的所有服务器。当服务器完成重新启动后,我需要从数组中删除该服务器,以便我可以将另一个服务器添加到数组中并对其运行重新启动函数。我尝试过使用$array.remove方法,但出现错误,说它不能在字符串数组上工作。我已经尝试重新定义原始数组而不包括重新启动的服务器。
"$balancedout = $balancedout -notlike $server".

1
请展示一段代码示例,说明您想要做的事情,类似于 $balancedout = $balancedout -notlike $server 这样的代码应该可以工作。 - zdan
3个回答

4
请注意,PowerShell使用类似于代码的.Net。因此,请按照以下方式声明数组:

如下所示:

 $a = New-Object System.Collections.ArrayList

现在您可以向此数组添加项目:
 $a.Add("Server1")
 $a.Add("Server2")
 $a.Add("Server3")

如果您打印该数组,您会得到以下结果:
PS C:\Users\Work> $a
Server2
Server1
Server3

现在$a确实有一个Remove方法:
 $a.Remove("Server2")

现在,如果您打印该数组,您将得到:
   PS C:\Users\Work> $a
Server1
Server3

感谢您的快速回复。那么通过这种方式声明允许使用 .remove 方法吗?在我的脚本中,我按照以下方式声明了数组(基于互联网文章)"$balancedout = @()"。您能解释一下其中的区别以及为什么 .remove 方法无法工作吗? - Patrick Matthews

4

可以像Joe Tatavaran建议的那样使用数组列表(这可能是最优雅的解决方案),或者像这样重新分配数组:

$a = $a | ? { $_ -ne $server }

-1
你能否将整个服务器列表加载到一个 ArrayList 中?你可以将它分成每五个项目为一组的数组,然后对每组服务器进行操作。
$servers = Get-Content serverlist.txt
$setIdx = -1
$sets = @()
for( $i = 0; $i -lt $servers.Count )
{
    if( $i % 5 -eq 0 )
    {
        $setIdx++
        $sets[$setIdx] = @()
    }
    $sets[$setIdx] += $servers[$idx]
}

foreach( $set in $sets )
{
    Restart-Computer $set[0]
    Restart-Computer $set[1]
    Restart-Computer $set[2]
    Restart-Computer $set[3]
    Restart-Computer $set[4]
}

我最初简要考虑过这个问题,但整个过程更为复杂,因为这些是 Citrix 服务器,我必须逐步引导用户从每台服务器上退出。因此,在一组 5 台服务器中,其中一台服务器可能需要 20 分钟来引导用户退出,而另一台服务器可能需要 24 小时才能引导用户退出。我想着不必等待一组中的最后一台服务器完成,即使其他 4 台已准备好数小时,我也可以设置一个数组,并将已完成的服务器移出并添加新的服务器。这样,我就可以保持服务器进出数组的常量流。 - Patrick Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接