运行命令,提取字段,运行结果命令

时间:2015-05-14 13:09:00

标签: powershell

道歉,如果这是一个非常简单的问题,但我不知所措。

我尝试做的是接受命令输出 - 在本例中来自NetApp DFM:

dfm event list

ID      Source  Name          Severity     Timestamp
------- ------- ------------- ----------- ------------ 
1         332   volume-online Normal      20 Apr 10:16
2         443   volume-online Normal      20 Apr 10:17
3         3222  volume-online Normal      20 Apr 10:18

我有大约17,000个事件 - 我想通过ID删除所有事件:

dfm event delete <ID>

我确切地知道我在Unix上是如何做到这一点的(过去,当这是我们的平台时):

for i in `dfm event list | awk '{print $1}'`
do 
    dfm event delete $i
done

奖励积分 - &#39; grep&#39;类型标准?我提前为这个问题的基本性质道歉 - 我曾尝试在谷歌上找一个合适的例子,但是没有发现任何东西。

我已经开始了:

dfm event list > dfmevent.txt
foreach ( $line in get-content dfmevent.txt ) { 
    echo $line 
}

但我想我会问是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

我无法访问您的环境进行测试,但如果您只是尝试访问ID的第一个元素,那么这应该是直接的。

dfm event list | ForEach-Object{$_.Split(" ",2)[0]} | Where-Object{$_ -match '^\d+$'} | ForEach-Object{
    #For Testing
    Write-Host "Id: $_ will be deleted"
    # Then do something
    # dfm event delete $_
}

我确定输出已经用新行分隔,因此发送到文件可能是多余的。

我们采取每一行并尝试在第一个空间拆分它。然后传递该数组中的第一个元素。接下来,我们确保元素确实是一个带有简单正则表达式检查的数字。这将确保我们只获得数字。我曾想过跳过前两行,但这也适用于其他文本。

最后一个循环用于处理ID。我在那里留下Write-Host进行测试。假设您获得了ID,那么您应该能够取消注释最后一行dfm event delete $_

答案 1 :(得分:1)

捕获DOS命令输出到Powershell是一个挑战。

使用原生snapin or module from NetApp会更容易。 可能值得一试,如果该链接有帮助

否则,您写入文本文件并将其重新读入的方法实际上是一个好主意,这是一种读取它并将数据推送到您需要的命令的方法。

$a = get-content dfmevent.txt
foreach ($i in $a) { if ($i.ReadCount -gt 2) { dfm event delete ($i.Substring(0,$i.IndexOf(" "))) } }

这将分配给变量$ result only

$a = get-content dfmevent.txt
$result = @()
foreach ($i in $a) { if ($i.ReadCount -gt 2) { $result += $i.Substring(0,$i.IndexOf(" "))} }

如果您不想写入文本文件,可以使用.NET方法直接捕获输出

$ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = "dfm"
$ProcessInfo.RedirectStandardOutput = $true
$ProcessInfo.UseShellExecute = $false
$ProcessInfo.Arguments = "event list"
$Process = New-Object System.Diagnostics.Process
$Process.StartInfo = $ProcessInfo
$Process.Start() | Out-Null
$Process.WaitForExit()
$output = $Process.StandardOutput.ReadToEnd()