1

我对 Powershell 很陌生。只使用了大约 2 周。

我有一个结构如下的文件:

服务名称:WSDL
服务号:14234321885
服务解析路径:/gman/wsdlUpdte
服务端点:
-------------------------------------------------- ------------------------------
服务名称:数据服务
服务编号:419434324305
服务解析路径:/widgetDate_serv/WidgetDateServ
服务端点:  
http://servername.company.com:1012/widgetDate_serv/WidgetDateServ
-------------------------------------------------- ------------------------------
服务名称:搜索服务
服务编号:393234543546
服务解析路径:/ProxyServices/SearchService
服务端点:  
http://servername.company.com:13010/Services/SearchService_5_0
http://servername2.company.com:13010/Services/SearchService_5_0
-------------------------------------------------- ------------------------------
服务名称:工人
服务号:14187898547
服务解析路径:/ProxyServices/Worker
服务端点:  
http://servername.company.com:131009/Services/Worker/v9
-------------------------------------------------- ------------------------------

我想解析文件并在单个列 (CSV) 中包含服务名称、服务 ID、服务解析路径和服务端点(有时包含多个或不包含值)。

除了使用 Get-Content 和遍历文件之外,我什至不知道从哪里开始。

任何帮助将不胜感激。谢谢

4

4 回答 4

3

使用 PowerShell 5,您可以使用绝妙的命令“convertfrom-string”

$template=@'
Service name: {ServiceName*:SearchService} 
Service ID: {serviceID:393234543546} 
Service resolution path: {ServicePath:/ProxyServices/SearchService} 
Serivce endpoints:
http://{ServiceEP*:servername.company.com:13010/Services/SearchService_5_0}
http://{ServiceEP*:servername2.tcompany.tcom:13011/testServices/SearchService_45_0}
--------------------------------------------------------------------------------
Service name: {ServiceName*:Worker} 
Service ID: {serviceID:14187898547} 
Service resolution path: {ServicePath:/ProxyServices/Worker} 
Serivce endpoints:
http://{ServiceEP*:servername3.company.com:13010/Services/SearchService}
--------------------------------------------------------------------------------
Service name: {ServiceName*:WSDL} 
Service ID: {serviceID:14234321885} 
Service resolution path: {ServicePath:/gman/wsdlUpdte} 
Serivce endpoints:
http://{ServiceEP*:servername4.company.com:13010/Services/SearchService_5_0}
--------------------------------------------------------------------------------
'@


#explode file with template
$listexploded=Get-Content -Path "c:\temp\file1.txt" | ConvertFrom-String -TemplateContent $template

#export csv 
$listexploded |select *, @{N="ServiceEP";E={$_.ServiceEP.Value -join ","}} -ExcludeProperty ServiceEP | Export-Csv -Path "C:\temp\res.csv" -NoTypeInformation
于 2016-11-13T14:31:26.800 回答
1

试试这个:

  1. 将文件内容读取为一个字符串
  2. 将其拆分为 81 个连字符
  3. 在冒号字符上拆分每个拆分项目并取最后一个数组项目
  4. 为每个项目创建新对象

    $pattern = '-'*81  
    $content = Get-Content D:\Scripts\Temp\p.txt | Out-String
    $content.Split($pattern,[System.StringSplitOptions]::RemoveEmptyEntries) | Where-Object {$_ -match '\S'} | ForEach-Object {
    
    $item = $_ -split "\s+`n" | Where-Object {$_}
    
        New-Object PSobject -Property @{
            Name=$item[0].Split(':')[-1].Trim()
            Id = $item[1].Split(':')[-1].Trim()
            ResolutionPath=$item[2].Split(':')[-1].Trim()
            Endpoints=$item[4..($item.Count)]
        } | Select-Object Name,Id,ResolutionPath,Endpoints
    }
    
于 2012-07-19T11:20:57.717 回答
1

尝试这个:

Get-Content | ? { $_ -match ': ' } | % { $_ -split ': ' } | Export-Csv Test.csv;

基本上可以归结为:

  1. 将所有文本内容作为数组获取
  2. 过滤包含“:”的行
  3. 对于剩下的每一行,将其拆分为':'
  4. 将对象数组导出到名为test.csv的 CSV 文件

希望这能为您指明正确的方向。

注意:代码未经测试。

于 2012-07-18T21:41:36.750 回答
0

这是用记录和记录(等等)解析文件的一般方法,它使用switch带有正则表达式和 begin()、Process()、end() 函数模板的强大 PowerShell 指令。

加载它,调试它,纠正它......

function Parse-Text
{
  [CmdletBinding()]
  Param
  (
    [Parameter(mandatory=$true,ValueFromPipeline=$true)]
    [string]$ficIn,
    [Parameter(mandatory=$true,ValueFromPipeline=$false)]
    [string]$ficOut
  )

  begin
  {
    $svcNumber = 0
    $urlnum = 0
    $Service = @()
    $Service += @{}
  } 

  Process 
  {
    switch -regex -file $ficIn
    {
      # End of a service
      "^-+"
      {
        $svcNumber +=1
        $urlnum = 0
        $Service += @{}
      }
      # URL, n ones can exist
      "(http://.+)" 
      {
        $urlnum += 1
        $url = $matches[1]
        $Service[$svcNumber]["Url$urlnum"] = $url
      }
      # Fields
      "(.+) (.+): (.+)" 
      {
        $name,$value = $matches[2,3]
        $Service[$svcNumber][$name] = $value
      }
    }
  }

  end 
  {
    #$service[3..0] | % {New-Object -Property $_ -TypeName psobject} | Export-Csv c:\Temp\ws.csv
    # Get all the services except the last one (empty -> the file2Parse is teerminated by ----...----)
    $tmp = $service[0..($service.count-2)] | Sort-Object @{Expression={$_.keys.count };Descending=$true}
    $tmp | % {New-Object -Property $_ -TypeName psobject} | Export-Csv $ficOut
  }
}


Clear-Host
Parse-Text -ficIn "c:\Développements\Pgdvlp_Powershell\Apprentissage\data\Text2Parse.txt" -ficOut "c:\Temp\ws.csc"
cat "c:\Temp\ws.csv"
于 2012-07-19T04:03:04.663 回答