2017-05-15 3 views
1

私は、PowerShellを使用して変数の出力から配列を作成する最善の方法を見つけようとしています。私に次のような出力を提供します文字列または変数から配列を作成する

$ListNames = & "listNames.cmd" | Out-String 

は、私は、次のコードを持っている

 
(c) 2016 - 2017 Use of this software is subject to license restrictions 
::Microsoft Windows 7 
::Microsoft Windows 7::name1 
::Microsoft Windows 7::name2 
::Microsoft Windows 7::name3 
::Microsoft Windows 7::name4 
::Microsoft Windows 7::name5 
::Microsoft Windows 7::name6 
::Microsoft Windows 7::name7 

I name7スルーname1から配列のすべてで必要

デリミタ:を使用してCSVに変換しようとしましたが、PSObjectを作成しようとしましたが、私が探していた結果を得られなかったいくつかの方法がありました。

ご迷惑をおかけして申し訳ございません。

+1

'$のListName -split '[\ rをする\ nの] +を' |どこでも{$ _ -match '::。+?::(。+)'} ForEach {$ Matches [1]} ' – TheMadTechnician

+0

ニース!完璧に働いた。 – Awsmike

+0

regex: '[regex] :: Matches($ ListNames、 '(?m)(?<:= +)$')。値' – TessellatingHeckler

答えて

0

私はおそらくこのようなものだろう:

  1. Out-Stringを削除します。とにかく出力を行単位で処理したいので、行をマージすると後でそれらを分割するだけで済みます。
  2. Where-Objectフィルタ(findまたはfindstr)を介して出力を関連する行に制限します。
  3. 残りの各行を::に分割し、結果の各配列から最後のフィールドを選択します。
& ".\listNames.cmd" | Where-Object { 
    $_ -like '::*::*' 
} | ForEach-Object { 
    ($_ -split '::')[-1] 
} 

@TheMadTechnicianが示唆したように別のオプションは、正規表現マッチのようになります。

& ".\listNames.cmd" | Where-Object { 
    $_ -match '^::.+?::(.+)' 
} | ForEach-Object { 
    $matches[1] 
} 
関連する問題