powershell 从命令输出中获取内容

Posted

技术标签:

【中文标题】powershell 从命令输出中获取内容【英文标题】:powershell get content from command output 【发布时间】: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...)中的文本。再次感谢

【问题讨论】:

【参考方案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' 等来执行您想要的操作。

【讨论】:

以上是关于powershell 从命令输出中获取内容的主要内容,如果未能解决你的问题,请参考以下文章

Python、Powershell 和 Popen

如何在 PowerShell 中输出内容

从PowerShell中使用参数和凭据启动.ps1脚本并从中获取输出

从 Powershell 中的输出中删除文本

如何使用 powershell 从 lync 对话中获取消息?

从 C++ 应用程序获取 PowerShell 脚本输出