【问题标题】:powershell get content from command outputpowershell 从命令输出中获取内容
【发布时间】:2014-01-01 23:53:49
【问题描述】:

我有来自外部命令的输出,例如:

Status  Pool name                 Media Type        MS   # of media   Free [MB]
===============================================================================
Good    pool1           LTO-Ultrium       No         303   298066893
Good    pool2           LTO-Ultrium       No           1     1525878
Good    pool3           LTO-Ultrium       No         282   348735361
Good    pool4           LTO-Ultrium       No         473   588150645

我需要在 PowerShell 中解析“pool1”、“pool2”、“pool3”......并在 foreach 中运行命令......对此有什么想法,而不将输出导出到 xml、csv 等? 谢谢

并且,第二季度, 在这里解析这些是相同或相似的方式:

Good   [QGHL5MMA] QGHL5MMA              [pool1:   322]            No   None              
Good   [QGHL5N2Y] QGHL5N2Y              [pool1:   922]            No   None              
Good   [QGHL5MUL] QGHL5MUL              [pool1:   621]            No   None              

从此输出中,我只需要第 5 列(322、922、621...)中的文本。再次感谢

【问题讨论】:

    标签: parsing powershell command external


    【解决方案1】:

    一个简单的正则表达式将捕获结果。

    gc .\table.txt | sls '\s+(pool\d+)\s+' | % {$_.Matches.Groups[1].Value}
    

    【讨论】:

      【解决方案2】:

      如果您创建对象,您可以在完成后使用它们执行各种 Powershell 操作。 Powershell 是关于对象的。

      使用您的示例数据和 Powershell V3

      $CommandData = 
      (@'
      Status  Pool name                 Media Type        MS   # of media   Free [MB]
      ===============================================================================
      Good    pool1           LTO-Ultrium       No         303   298066893
      Good    pool2           LTO-Ultrium       No           1     1525878
      Good    pool3           LTO-Ultrium       No         282   348735361
      Good    pool4           LTO-Ultrium       No         473   588150645
      '@).split("`n") |
      foreach {$_.trim()}
      
      $CommandData | 
       foreach {
        $Props = &{$args} Status Pool Media Type MS No Free[MB]
        if ($_ -match '\d+\s*$')
         {$Parts = $_ -split '\s+'
          $Hash = [ordered]@{}
          for ($i=0; $i -le 5; $i++)
           {$Hash[$Props[$i]] = $Parts[$i]}
          [PSCustomObject]$Hash
          }
         } | | Format-Table -AutoSize
      
      
      Status Pool  MediaType   MS No  Free[MB] 
      ------ ----  ---------   -- --  -------- 
      Good   pool1 LTO-Ultrium No 303 298066893
      Good   pool2 LTO-Ultrium No 1   1525878  
      Good   pool3 LTO-Ultrium No 282 348735361
      Good   pool4 LTO-Ultrium No 473 588150645
      

      【讨论】:

      • 我需要学习你的例子——我是数组、哈希等方面的新手。但我认为,对于脚本的另一部分,我没有其他方法......
      【解决方案3】:

      我将内容放入文件test.txt 并尝试如下:

      gc .\test.txt | select-string '.*pool\d+.*' | foreach { $pool = ($_  -split '\s+')[1];write-host $pool;}
      

      还有输出:

      pool1
      pool2
      pool3
      pool4
      

      在命令行中,我搜索模式为 'pool' 后跟数字的行,然后使用空格作为分隔符将其拆分,然后您可以获得名称 'pool1' 等来执行您想要的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 2022-10-17
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多