在Powershell中解析字符串

时间:2014-05-01 00:11:21

标签: string parsing powershell

我是一个c-shell家伙所以我正在努力学习powershell。我有以下文件:

环境:生产

服务器:3

用户:25

节点:20

环境:alpha

服务器:4

用户:21

节点:19

我想检查一下,如果左边的第一个值是“Environment”,那么我将变量存储在右边的值 - “Production”中,然后从那里存储每个后续的左/右对,直到我点击下一个“环境”,我将存储下一个值。

我无法使用ForEach-Object使我的regexp powershell工作。

2 个答案:

答案 0 :(得分:1)

你不应该需要正则表达式......

$servs = @()
get-content file.txt | % {
  $split = $_ -split ":"
  if($split[0].trim() -eq "Environment"){
     $obj = New-Object System.Object
     $obj | Add-Member -type NoteProperty -name $split[0] -value $split[1].trim()
  }
  elseif($split[0].trim() -eq "Nodes"){
     $obj | Add-Member -type NoteProperty -name $split[0] -value $split[1].trim()
     $servs += $obj
  }
  elseif($split -ne $null){
     $obj | Add-Member -type NoteProperty -name $split[0] -value $split[1].trim()
  }
}

现在,您应该在$servs中拥有一组自定义对象,如下所示:

Environment                         Servers                             Users                               Nodes                             
-----------                         --------                            ------                              ------                            
production                          3                                   25                                  20                                
alpha                               4                                   21                                  19

答案 1 :(得分:0)

另一种可能性,因为它似乎是格式良好的数据:

(@'
Environment: production
Servers : 3
Users : 25
Nodes : 20
Environment: alpha
Servers : 4
Users : 21
Nodes : 19
'@).split("`n") |
foreach {$_.trim()} |
set-content test.txt

get-content test.txt -ReadCount 4 |
foreach { 
 new-object psobject -property (convertfrom-stringdata ($_.replace(':','=') -join "`n"))
 } | ft -auto


Environment Users Nodes Servers
----------- ----- ----- -------
production  25    20    3      
alpha       21    19    4