2014-08-28 54 views
1

我有一個名爲$ Disk的變量,它通過一個foreach循環進行填充,該循環處理返回許多輸出行的命令的輸出。Powershell - 提取第一個和第三個元素的表單字符串變量

對於循環的每次迭代的$磁盤變量包含數據模擬器:

Harddisk4 Disk1 SQLDG1 MBR 0  0 Offline  [email protected] P4C0T0L3 - - F6799A78-9C10-443C-B4E6-22E3B30563C0 60003FFF409638B0B4E622E3B30563C0 

我需要提取此字符串從所述第一和第三詞;字符串中的所有「單詞」可以是可變長度的。

我想直到結束:

$Harddisk等於:Harddisk4

$DG等於:SQLDG1

到目前爲止,我還沒有找到一種方法來做到這一點。 PowerShell有什麼選擇來實現這個目標?做到這一點

+0

什麼程序產生這個輸出?我想知道是否可能有一個管理的等價物... – 2014-08-29 02:48:00

回答

0

一種方法是使用正則表達式來處理每一行,根據您的具體輸入格式是什麼,它可能是這個樣子:

foreach($Disk in (Get-ManyLinesOfOutput)) { 
    if ($Disk -match "^(?<harddisk>\S+) \w+ (?<dg>\S+)") { 
     $Harddisk = $matches["harddisk"]; 
     $DG = $matches["dg"]; 
     # do something 
    } 
} 

對於.NET正則表達式語法PowerShell使用請參閱例如http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx

2

馬庫斯的回答十分elegnate使用命名匹配

要顯示的另一種方法,因爲總是有另一個

ForEach($line in $Document){ 
    $splitUp = $line -split "\s+" 
    $Harddisk = $splitUp[0] 
    $DG = $splitUp[2] 
    ... other code stuff 
} 

從管道

Get-Content c:\somefile.txt | ForEach-Object{ 
    $splitUp = $_ -split "\s+" 
    $Harddisk = $splitUp[0] 
    $DG = $splitUp[2] 
    ... other code stuff 
} 

\s+會分割線在任何一組空白處留下你的每一個單詞。這可能是一些文本的任何問題,但只要您尋找的細節不包含它適合的空格。 02將表示基數0數組中的第1個和第3個條目。

將爲$Harddisk$DG提供以下輸出。

Harddisk4 
SQLDG1 
+0

+1與「\ s +」分裂。非常有用的提示! – Gruntzy 2014-08-29 09:25:30

0

感謝馬特,

這裏是我結束了使用的帳戶鎖定出局安全事件日誌事件。

#Event Log Information 
$EventInfo = Get-EventLog "Security" | Where {$30MinutesAgo -le $_.TimeWritten -and $_.eventid -eq 4740} | Format-List | Out-String 
ForEach ($line in $EventInfo){ 
    #Split line with ReplacementStrings : {accountname, computer, S-1..., S-1-5...} line 
    $splitUp = $line -split "{" 
    $EvReplacementStrings = $splitUp[1] -split ", " 
    $EvUserName = $EvReplacementStrings[0] 
    $EvComputer = $EvReplacementStrings[1] 
} 
1

因爲你想把值輸出到2個變量中,它需要一些小小的擺弄。我能做的最好的是:

$arr = $Disk -split " "; $Harddisk=$arr[0]; $DG = $arr[2] 
相關問題