2016-05-11 4 views
0

У меня есть встроенная команда CMD, которая выводит этот текст: каждый раздел разделен на строку «-----», я хочу получить каждую порцию в другом массиве, поэтому я могу обработать результат каждый из них,Parse/Split Text Array

Microsoft (R) Windows Script Host Version 5.8 
Copyright (C) Microsoft Corporation. All rights reserved. 

---Processing-------------------------- 
--------------------------------------- 
SKU ID: 2b88c4f2-ea8f-43cd-805e-4d41346e18a7 
LICENSE NAME: Office 15, OfficeProPlusVL_MAK edition 
LICENSE DESCRIPTION: Office 15, RETAIL(MAK) channel 
BETA EXPIRATION: 01/01/1601 
LICENSE STATUS: ---LICENSED--- 
Last 5 characters of installed product key: HT7T7 
--------------------------------------- 
SKU ID: 3e4294dd-a765-49bc-8dbd-cf8b62a4bd3d 
LICENSE NAME: Office 15, OfficeVisioProVL_MAK edition 
LICENSE DESCRIPTION: Office 15, RETAIL(MAK) channel 
BETA EXPIRATION: 01/01/1601 
LICENSE STATUS: ---LICENSED--- 
Last 5 characters of installed product key: WTWRR 
--------------------------------------- 
SKU ID: ed34dc89-1c27-4ecd-8b2f-63d0f4cedc32 
LICENSE NAME: Office 15, OfficeProjectProVL_MAK edition 
LICENSE DESCRIPTION: Office 15, RETAIL(MAK) channel 
BETA EXPIRATION: 01/01/1601 
LICENSE STATUS: ---LICENSED--- 
Last 5 characters of installed product key: TVGWY 
--------------------------------------- 
--------------------------------------- 
---Exiting----------------------------- 

EDIT: Это мой код, я думаю, что это сложно, но только для вас знать, что я не хочу, чтобы вы делать свою работу так:

Function Parse-OSPPResult 
{ 
Param(
[Parameter(Mandatory = $true)] 
$Result 
) 

$c = $Result | ? {$_ -notmatch '^Microsoft|^Copyright|Processing|Exiting|^LICENSE STATUS'} 
$c = $c[0..($c.Length -3)] 
$LineNumbers = $c | Select-String '^--' |select -ExpandProperty linenumber 

if ($LineNumbers.Count -gt 1) 
{ 
    $array = @{} 

    for ($i=0; $i -lt ($LineNumbers.Count -1); $i++) 
    { 
    $array[$i] = $c[$LineNumbers[$i]..($LineNumbers[($i + 1)]-2)] 
    } 
    $array[$i] = $c[$LineNumbers[$i]..($c.Length -1)] 
} 
    else 
    { 
    $array[0] = $c[$LineNumbers..($c.Length)] 
    } 

$arr = @() 

    foreach ($item in ($array.GetEnumerator() | % {$_.Name})) 
    { 
    $Name = (($array[$item] | ? {$_ -match '^LICENSE NAME:'}) -split ': ')[-1] 
    $Desc = (($array[$item] | ? {$_ -match '^LICENSE DESCRIPTION:'}) -split ': ')[-1] 
    $Key = (($array[$item] | ? {$_ -match '^Last 5'}) -split ': ')[-1] 
    $row = "" | Select Name,Description,Key 
    $row.Name = $Name 
    $row.Description = $Desc 
    $row.Key = $Key 
    $arr += $row 
    } 

    return $arr 
} 

Результат:

Name          Description     Key 
----          -----------     --- 
Office 15, OfficeProjectProVL_MAK edition Office 15, RETAIL(MAK) channel HT7T7 
Office 15, OfficeVisioProVL_MAK edition Office 15, RETAIL(MAK) channel WTWRR 
Office 15, OfficeProPlusVL_MAK edition Office 15, RETAIL(MAK) channel TVGWY 

будет рад видеть другие подходы, если это возможно.

* Примечание: Иногда результат имеет только один участок ...

Спасибо.

ответ

3

это работало для меня

$text = @' 
---Processing-------------------------- 
--------------------------------------- 
SKU ID: xxxxxxx-ea8f-43cd-805e-xxxxxxxxxx 
LICENSE NAME: Office 15, OfficeProPlusVL_MAK edition 
LICENSE DESCRIPTION: Office 15, RETAIL(MAK) channel 
BETA EXPIRATION: 01/01/1601 
LICENSE STATUS: ---LICENSED--- 
Last 5 characters of installed product key: XXXXX 
--------------------------------------- 
SKU ID: xxxxxxx-a765-49bc-8dbd-xxxxxxxxxx 
LICENSE NAME: Office 15, OfficeVisioProVL_MAK edition 
LICENSE DESCRIPTION: Office 15, RETAIL(MAK) channel 
BETA EXPIRATION: 01/01/1601 
LICENSE STATUS: ---LICENSED--- 
Last 5 characters of installed product key: XXXXX 
--------------------------------------- 
SKU ID: ed34dc89-1c27-4ecd-8b2f-63d0f4cedc32 
LICENSE NAME: Office 15, OfficeProjectProVL_MAK edition 
LICENSE DESCRIPTION: Office 15, RETAIL(MAK) channel 
BETA EXPIRATION: 01/01/1601 
LICENSE STATUS: ---LICENSED--- 
Last 5 characters of installed product key: XXXXX 
--------------------------------------- 
--------------------------------------- 
---Exiting----------------------------- 
'@ -split "`n" 

$hash = @{} 
$object = foreach ($line in $text) { 
    if ($line.startswith('----') -and [bool]$($hash.Keys)) { 
     [pscustomobject]$hash 
     $hash = @{} 
     continue 
    } elseif ($line -match '(.*):(.*)') { 
     $hash.Add($Matches[1].trim(), $Matches[2].trim()) 
    } 
} 

$object 
+0

хорошо, вы можете объяснить немного? – JustCurious

+0

Я нахожу этот ответ, самый легкий, спасибо ... – JustCurious

3

В опрятнее версии:

# Somewhere to hold the information for each program entry 
$program = @{} 

$result = foreach ($line in Get-Content d:\t.txt) { 

    # Reset at the beginning of a new SKU or at the end of everything. 
    # Output the program details, and initialize for the next one 
    if ($line -match '^SKU' -or $line -match '---Exiting') { 
     if ($program.Count) { [pscustomobject]$program } 
     $program = @{} 
    } 


    # Lines which have colons contain data 
    if ($line -match ':') { 
     $name, $value = $line.Split(':', 2) 

     # Replace the long names with the desired shorter names 
     switch -Regex ($name) { 
      'license name'  { $name = 'Name' } 
      'license description' { $name = 'Description' } 
      'product key'   { $name = 'Key' } 
     } 

     # Save the data for each line into the program store 
     $program[$name] = $value 
    } 

} 

# Choose the desired results 
$result | select Name, Description, Key 

Версия для гольфа:

(gc d:\t.txt -Raw)-split'-{39}'|%{[email protected]{};($_-split'\n')-match':'|%{ 
$k,$v=$_.Split(':',2);$p[$k]=$v.Trim()};if($p.Count){[pscustomobject]$p}} 
+0

версия для гольфа очень крутая – JustCurious

+0

@ JustCurious теперь еще больше в гольф; и версия Tidy больше не выплевывает пустой объект! – TessellatingHeckler

4

Я хотел бы сделать это следующим образом:

function Split-CommandOutput 
{ 
    [CmdletBinding()] 
    Param 
    (
     [Parameter(Mandatory = $true, ValueFromPipeline = $true)] 
     [string[]]$InputObject 
    ) 

    End 
    { 
     # Collect all pipeline input and make sure it's an array of strings 
     $InputObject = @($input) | ForEach-Object {$_ -split [System.Environment]::NewLine} 

     # Separator to split records 
     $Separator = '^-+$' 

     # Find start and end indexes of each record 
     $RecordBounds = 0..($InputObject.Length-1) | Where-Object {$InputObject[$_] -match $Separator} 

     # Split records into multidimensional array 
     $Records = @() 
     for ($i=0 ; $i -lt ($RecordBounds.Length-1) ; $i++) 
     { 
      $Records += ,($InputObject[($RecordBounds[$i]+1)..($RecordBounds[$i+1]-1)]) 
     } 

     # Process each record 
     foreach($record in $Records) 
     { 
      # For each item in record 
      $Properties = @{} 
      foreach($item in $record)  
      { 
       # Extract data using regex 
       if($item -match '\s*(.+)\s*:\s*(.+)\s*') 
       { 
        $Properties.Add($Matches[1], $Matches[2]) 
       } 
      } 

      # Create new object 
      New-Object -TypeName PSCustomObject -Property $Properties 
     } 
    } 
} 

Вы можете строки трубы, массивы строк и вывода инструмента непосредственно к этой функции:

MyTool.exe | Split-CommandOutput 
$ArrayOfStrings | Split-CommandOutput 
$SingleString | Split-CommandOutput 

Результат:

LICENSE NAME        : Office 15, OfficeProPlusVL_MAK edition 
LICENSE DESCRIPTION      : Office 15, RETAIL(MAK) channel 
BETA EXPIRATION       : 01/01/1601 
SKU ID          : xxxxxxx-ea8f-43cd-805e-xxxxxxxxxx 
LICENSE STATUS        : ---LICENSED--- 
Last 5 characters of installed product key : XXXXX 

LICENSE NAME        : Office 15, OfficeVisioProVL_MAK edition 
LICENSE DESCRIPTION      : Office 15, RETAIL(MAK) channel 
BETA EXPIRATION       : 01/01/1601 
SKU ID          : xxxxxxx-a765-49bc-8dbd-xxxxxxxxxx 
LICENSE STATUS        : ---LICENSED--- 
Last 5 characters of installed product key : XXXXX 

LICENSE NAME        : Office 15, OfficeProjectProVL_MAK edition 
LICENSE DESCRIPTION      : Office 15, RETAIL(MAK) channel 
BETA EXPIRATION       : 01/01/1601 
SKU ID          : ed34dc89-1c27-4ecd-8b2f-63d0f4cedc32 
LICENSE STATUS        : ---LICENSED--- 
Last 5 characters of installed product key : XXXXX 
+0

спасибо за обмен и объяснение голосов – JustCurious