首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ForEach中停止多次遍历整个列表?

如何在ForEach中停止多次遍历整个列表?
EN

Stack Overflow用户
提问于 2019-05-23 02:39:44
回答 1查看 40关注 0票数 1

如何将一个列表中的1个IP地址应用于另一个列表中的1台服务器?然后移动到下一个IP并将其应用到下一个服务器。

servers.txt看起来像这样:

代码语言:javascript
复制
server1
server2
server3

ip.txt看起来像这样:

代码语言:javascript
复制
10.1.140.80
10.1.140.81
10.1.140.83

我只想看一遍名单,然后申请

代码语言:javascript
复制
10.1.140.80 to server1
10.1.140.81 to server2
10.1.140.83 to server3

相反,我的脚本将所有3个IP地址应用到每个服务器。我不想一遍又一遍地遍历所有的IP地址。

我怎样才能正确地遍历列表并纠正这个错误?

代码语言:javascript
复制
$computers = "$PSScriptRoot\servers.txt"
$iplist        = gc "$PSScriptRoot\ip.txt"

function changeip {
    get-content $computers | % {
        ForEach($ip in $iplist) {

            # Set IP address
            $remotecmd1 = 'New-NetIPAddress -InterfaceIndex 2 -IPAddress $ip -PrefixLength 24 -DefaultGateway 10.1.140.1'

            # Set DNS Servers  -  Make sure you specify the server's network adapter name at -InterfaceAlias
            $remotecmd2 = 'Set-DnsClientServerAddress -InterfaceAlias "EthernetName" -ServerAddresses 10.1.140.5, 10.1.140.6'

            Invoke-VMScript -VM $_ -ScriptText $remotecmd1 -GuestUser Administrator -GuestPassword PASSWORD -ScriptType PowerShell
            Invoke-VMScript -VM $_ -ScriptText $remotecmd2 -GuestUser Administrator -GuestPassword PASSWORD -ScriptType PowerShell

        }
    }
}

changeip
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 03:18:43

使用Get-Content cmdlt将两个文件内容放入一个数组中,然后按数组位置拉取各个值。您可能需要一些逻辑来检查数组大小是否匹配,如果不匹配,则进行自定义处理。在上面的示例中,您基本上是将一个for each循环放入另一个foreach循环中,该循环给出了您所看到的行为。

代码语言:javascript
复制
$computers = GC "C:\server.txt"
$iplist   = GC "C:\ip.txt"

for ($i = 0; $i -lt $iplist.Count ; $i++) {
    Write-host  ("{0}  -  {1}" -f $computers[$i],$iplist[$i])
}

或者,如果您非常喜欢使用foreach逻辑来处理一个列表,而不是使用for循环进行基本的迭代,那么您可以在foreach循环中添加一个计数器。然后,您可以查找已解析的iplist数组的数组索引。它基本上是在做同样的事情..

代码语言:javascript
复制
$computers = "C:\server.txt"
$iplist   = GC "C:\ip.txt"

get-content $computers | % {$counter = 0} {
Write-host  ("{0}  -  {1}" -f $_,$iplist[$counter])
$counter++
}

为了清楚起见,请注意这一行:

"get-content $computers | %“

%实际上是ForEach-Object的别名,这就是为什么要在您看到的foreach输出中获取foreach的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56263061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档