AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 582231
Accepted
driz
driz
Asked: 2014-03-15 12:37:06 +0800 CST2014-03-15 12:37:06 +0800 CST 2014-03-15 12:37:06 +0800 CST

Powershell Array - 相同的位置组合

  • 772

我有一个返回以下信息的脚本

Analog Phones   IP Phones   Location
-------------   ---------   --------
0               883         Site1
413             0           Site1
0               4           Site1
0               258         Site2
9               75          Site2
183             0           Site2

此信息存储在数组 $arrayX 中

我想弄清楚如何让输出显示

Analog Phones   IP Phones   Location
-------------   ---------   --------
413             887         Site1
192             333         Site2

馈入数组的数据不是以这种方式呈现的;有没有人对如何完成这样的事情有任何想法?我可以发布整个脚本,但它现在是 java、axl 和 powershell 的混乱。

脚本中有一点数据看起来像这样

Analog Phones   IP Phones   Location
-------------   ---------   --------
413             0           Site1-AGW-DP
0               883         Site1-PHONES-DP
0               4           Site1-PHSRST-DP


正在使用的 XML 文件是从 java axl 程序输出的。其中之一的结果如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <axl:executeSQLQueryResponse xmlns:axl="http://www.cisco.com/AXL/API/6.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" sequence="1394831301468">
            <return>
                <row>
                    <analog_phones>0</analog_phones>
                    <ip_phones>47</ip_phones>
                    <devicepool>Site20-PHONES-DP</devicepool>
                </row>
                <row>
                    <analog_phones>533</analog_phones>
                    <ip_phones>0</ip_phones>
                    <devicepool>Site20-AGW-DP</devicepool>
                </row>
                <row>
                    <analog_phones>1</analog_phones>
                    <ip_phones>689</ip_phones>
                    <devicepool>Site20-PHSRST-DP</devicepool>
                </row>
            </return>
        </axl:executeSQLQueryResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在 java 位之后启动的 Powershell 脚本

$files = (Get-ChildItem .\*out.xml).name
foreach ($file in $files){
    [xml]$xmlfiles = gc $file
    $finalxml += $xmlfiles.envelope.body.executeSQLQueryResponse.return.row
    Remove-Item $pwd\$file
}
$outarray  = @()
$sitelist = import-csv sites.csv
foreach($item in $finalxml){
    if(!$item.devicepool){$sed="BLANK"}
    else{$sed=($item.devicepool).substring(0,4)}
    $location=($sitelist | where-object {$_.prefix -eq $sed}).Facility
    if(!$location){$location=$sed}
    $outarray+=New-object psobject -property @{
        'Analog Phones' = $item.analog_phones
        'IP Phones' = $item.ip_phones
        'Location' = $location
    }
}

$outarray | Sort-Object 'Analog Phones','IP PHones' -unique | sort-object Location | select-object 'Analog Phones','IP Phones',Location |export-csv $csvout
powershell
  • 2 2 个回答
  • 792 Views

2 个回答

  • Voted
  1. Byron C.
    2014-03-15T13:00:14+08:002014-03-15T13:00:14+08:00

    从外观上看,您是在尝试将所有结果合并到每个站点的单个条目中吗?例如 - 每个位置的模拟电话总数和 IP 电话总数。

    如果是这种情况,您应该能够遍历该数组。合计每个站点的模拟电话和 IP 电话,然后使用这些值填充新数组。

    如果您正在寻找一些代码,我们必须知道如何构造数组来构建逻辑。

    • 1
  2. Best Answer
    user2196728
    2014-03-17T01:53:15+08:002014-03-17T01:53:15+08:00

    像这样的东西应该工作:

    $result = @()
    
    Function getIndex($location)
    {
      for($j = 0; $j -lt $result.Count; $j++) {
        if($result[$j].Location -contains "$location") {
          $index=$j
          break;
        }
      }
      return $index
    }
    
    for ($i=0; $i -lt $outarray.length; $i++) {
      $loc=$outarray[$i].Location
      $aphones=$outarray[$i].'Analog Phones'
      $ipphones=$outarray[$i].'IP Phones'
      if(!($result | where-object {$_.Location -eq "$loc"})) {
        $result+=New-object psobject -property @{'Location' = "$loc"; 'Analog Phones' = $aphones; 'IP Phones' = $ipphones}  
        } else {
          $index=getIndex($loc) 
          $result[$index].'Analog Phones' = $result[$index].'Analog Phones' + $aphones
          $result[$index].'IP Phones' = $result[$index].'IP Phones' + $ipphones
       }
    }
    $result
    

    $result输出是:

    Analog Phones      IP Phones     Location
    -------------      ---------     --------
              413            887     Site1
              192            333     Site2
    

    这是逻辑:

    Define an empty $result array to store final results
    Iterate over $outarray
      each time a location is found
         if location does not exists in $result then
            add full line from $outarray into $result for this location
    
         if location already exists in $result then
            retrieve the index for the given location in $result
            update Analog Phones number in $result with values from $outarray + $result for the given location (index)
            update IP Phones number in $result with values from $outarray + $result for the given location (index)
    

    PS:我不是Powershell Guru,所以我认为getIndex可以改进。但是,根据您的源代码,它对我有用。

    希望它会有所帮助!


    编辑

    这是我将代码集成到您的代码中的方式:

    首先,我创建了$outarray像你一样的东西(我认为),除了我使用了硬编码值(不解析 xml 文件):

    $outarray  = @()
    $outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 883;'Location' = "Site1"}
    $outarray+=New-object psobject -property @{'Analog Phones' = 413;'IP Phones' = 0;'Location' = "Site1"}
    $outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 4;'Location' = "Site1"}
    $outarray+=New-object psobject -property @{'Analog Phones' = 0;'IP Phones' = 258;'Location' = "Site2"}
    $outarray+=New-object psobject -property @{'Analog Phones' = 9;'IP Phones' = 75;'Location' = "Site2"}
    $outarray+=New-object psobject -property @{'Analog Phones' = 183;'IP Phones' = 0;'Location' = "Site2"}
    

    从这一点来看,我的$outarray样子是这样的:

    Analog Phones    IP Phones    Location
    -------------    ---------    --------
                0          883    Site1
              413            0    Site1
                0            4    Site1
                0          258    Site2
                9           75    Site2
              183            0    Site2
    

    然后我在你的export-csv命令之后添加了我的代码:

    $outarray | Sort-Object............
    
    MY CODE HERE
    

    编辑 2

    我发现您的实际代码存在问题:数字被解释为字符串,因此无法正确计算。您必须将它们转换为整数:

    foreach($item in $finalxml){
      ...
      ...
      $outarray+=New-object psobject -property @{
            'Analog Phones' = [int]$item.analog_phones
            'IP Phones' = [int]$item.ip_phones
            'Location' = $location
        }
    }
    
    • 1

相关问题

  • 资源锁和电源外壳

  • 脚本 - 如何断开远程桌面会话?

  • 如何限制向通讯组发送到外部地址?

  • Powershell对值与数组的作用不同?

  • Windows Powershell Vim 键绑定

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve