2013-07-09 129 views
3

我想从字符串数组中删除项目。它是一个由5个服务器名称组成的数组,我针对阵列中的每个服务器运行重新启动功能。我一次只能重新启动5台服务器,因此阵列永远不会比这更大,但同时我想继续向阵列添加服务器,这样我就可以循环访问环境中的所有服务器。当服务器完成重新启动时,我需要从阵列中删除该服务器,以便我可以向阵列添加另一个服务器,并针对它运行重新启动功能。我已尝试$array.remove方法,但出现错误,指出它不适用于字符串数组。我已尝试重新定义原始阵列而不重启服务器从Powershell中的字符串动态数组中删除项目

"$balancedout = $balancedout -notlike $server". 
+1

请显示您正在尝试执行的代码示例,类似'$ balancedout = $ balancedout -notlike $ server'应该可以工作。 – zdan

回答

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确实有删除方法:

$a.Remove("Server2") 

现在如果打印数组你:

PS C:\Users\Work> $a 
Server1 
Server3 
+0

感谢您的快速响应。那么通过以这种方式声明允许.remove方法?在我的脚本中,我声明如下的数组(基于Internet文章)“$ balancedout = @()”。你能向我解释什么是差异,为什么.remove不起作用? –

+0

我完成了这条路线。万分感谢。 –

3

要么使用一个数组列表为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] 
} 
+0

我在开始时曾经简单地考虑过这个问题,但整个过程比较精细,看看这些服务器是如何运作的,而且我必须让每一个用户都看不到。因此,在一组5台服务器中,一台服务器可能需要20分钟才能关闭用户,另一台服务器可能需要24小时才能关闭用户。与其等待最后一台服务器完成5组,即使其他4台服务器已准备好几个小时,我还是会设置一个数组,以便将服务器移出服务器,然后移入新服务器。我可以保持服务器不断进出数组 –