2015-05-14 124 views
0

道歉,如果这是一个非常简单的问题,但我在无所事事。运行命令,提取一个字段,运行一个结果命令

我试图做的是采取了命令的输出 - 在这种情况下,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 

我有17000的事件 - 我想通过ID来将它们全部删除,运行:

dfm event delete <ID> 

我知道正是我怎么会做这在Unix(以及用于当这是我们平台):

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

奖励积分 - “grep”类型的标准?我事先对这个问题的基本性质表示歉意 - 我试着在Google上寻找一个合适的例子,但没有发现任何东西。

我已经开了一个头:

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

但我想我会问,如果有一个更好的办法。

回答

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 $_

+0

现货,正是我之后,谢谢。 – Sobrique

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(" "))) } } 

这将赋予变量$结果只

$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()