2015-05-14 123 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()