powershell从命令输出中获取内容

时间:2013-12-14 04:16:51

标签: parsing powershell command external

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

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&等? 感谢

和,Q2, 解析这些是相同或相似的方式:

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 ......)。再次感谢

3 个答案:

答案 0 :(得分:4)

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

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

输出:

pool1
pool2
pool3
pool4

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

答案 1 :(得分:1)

如果你创建了对象,你可以在完成后用它们做各种各样的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

答案 2 :(得分:0)

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

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