2014-08-28 81 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] 
相关问题