gpt4 book ai didi

powershell - 为什么每次迭代后我的 foreach 变量不会在 PowerShell 中输出到我的输出?

转载 作者:行者123 更新时间:2023-12-04 07:50:50 24 4
gpt4 key购买 nike

我有一个 DHCP 脚本,它在 DHCP 服务器的所有范围内查找匹配的主机名

  • 我首先获取所有 DHCP 服务器并导入主机名的 .txt
  • $list = Get-Content C:\script\HostNameList.txt #Defines content it pulls as list 
    $DHServers = Get-DhcpServerInDC #gives variable name for loop

    # Gets all DHCP servers ands scopes
    foreach ($Server in $DHServers){
    $scopes = Get-DHCPServerv4Scope -ComputerName $Server.dnsname #get all scopes
    }
  • 我遍历主机名和范围列表以寻找匹配项。这里的某个地方是我的问题
  • $Output = foreach ($hostname in $list) { #Calls each item in list a hostname and sends to output
    if (test-connection -count 1 -computername $hostname -quiet) #With 1 ping, check if hostname is online
    {
    foreach ($scope in $scopes){
    if($scope | Get-DhcpServerV4Lease -ComputerName $server.dnsname | Where-Object HostName -like "$hostName*" ) #compares the hostname to lease to find which scope it is in
    { $scope.name } #return scope it found hostname in
    }
    [PSCustomObject]@{ #Rename varibles in data pull for output file
    Asset = $hostname
    Location = $scope.name #only want the name of the scope
    Status = "Online"
    }
    }

    else #statement if hostname is not online
    {
    Write-host "$hostname Is offline, only Last Location is known. $hostname was added to the output file." -BackgroundColor DarkRed
    [PSCustomObject]@{
    Asset = $hostname
    Location = $scope.name #only want the name of the scope, since the name = Location
    Status = "Offline"
    }
    }
    }
    $Output #show output in powershell
    $Output | Export-Csv -Path C:\script\Asset_Result.csv -NoTypeInformation #outputs .csv
  • 这就是它正在做的事情,输出重复 DHCP 作用域列表中的最后一项。
  • Asset    Location         Status
    ----- -------- ------
    A847 Public Internet Online
    A261 Public Internet Offline
    A201 Public Internet Online
  • 这是它应该做的
  • Asset    Location         Status
    ----- -------- ------
    A847 FLoor 1 Online
    A261 West 1st FL Offline
    A201 Floor 3 Online
    我怎样才能得到 $scope.name在我的 if($scope | ...每次迭代后转到我的 PSCustomObject 的语句?

    最佳答案

    这个:

    foreach ($Server in $DHServers){
    $scopes = Get-DHCPServerv4Scope -ComputerName $Server.dnsname #get all scopes
    }
    是 - 在净效果上 - 相当于:
    $scopes = Get-DHCPServerv4Scope -ComputerName $DHServers[-1].dnsname #get all scopes
    也就是说,您不断重新分配给循环体中的同一个变量 ( $scopes ),替换之前的值,这样您最终只能得到最后一次循环迭代的结果,用于存储在 $DHServers 中的最后一个服务器。 ,即 $DHServers[-1] .

    最好的解决方案是依靠 PowerShell 使用诸如 foreach 之类的语句的能力。作为一个表达式,其输出 - 甚至循环的迭代输出 - 会自动收集在 [object[]] 中PowerShell 的数组(具有两个或更多输出):
    # Collect the output from *all* Get-DHCPServerv4Scope calls.
    [array] $scopes = foreach ($Server in $DHServers) {
    Get-DHCPServerv4Scope -ComputerName $Server.dnsname #get all scopes
    }
    注意: [array]类型约束(与: [object[]] 相同)仅当在特定情况下可能只有一个输出对象并且您希望确保收集的输出始终是一个数组时才需要。

    关于powershell - 为什么每次迭代后我的 foreach 变量不会在 PowerShell 中输出到我的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66988468/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com