1

私はPowershellを初めて使用します。約2週間しか使用していません。

次のような構造のファイルがあります。

サービス名:WSDL
サービスID:14234321885
サービス解決パス:/ gman / wsdlUpdte
サービスエンドポイント:
-------------------------------------------------- ------------------------------
サービス名:DataService
サービスID:419434324305
サービス解決パス:/ widgetDate_serv / WidgetDateServ
サービスエンドポイント:  
http://servername.company.com:1012/widgetDate_serv/WidgetDateServ
-------------------------------------------------- ------------------------------
サービス名:SearchService
サービスID:393234543546
サービス解決パス:/ ProxyServices / SearchService
サービスエンドポイント:  
http://servername.company.com:13010/Services/SearchService_5_0
http://servername2.company.com:13010/Services/SearchService_5_0
-------------------------------------------------- ------------------------------
サービス名:ワーカー
サービスID: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

これを試して:

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

基本的に、それは次のように要約されます。

  1. すべてのテキストコンテンツを配列として取得
  2. ':'を含む行をフィルタリングします
  3. 残った行ごとに、':'で分割します
  4. オブジェクト配列をtest.csvという名前のCSVファイルにエクスポートします

これがあなたを正しい方向に向けることを願っています。

注:コードはテストされていません。

于 2012-07-18T21:41:36.750 に答える
1

これを試してみてください:

  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 に答える
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 に答える