0

私はまだ Powershell を使い始めたばかりです。文字列をPowerShellに適したオブジェクトに変換する方法に頭を悩ませています(Powershellプロパティ名と各プロパティ名のそれぞれの値、またはそれが複雑すぎる場合は2次元配列グリッドに変換されます)。理想的には、将来どちらの方法でも実行できるように、それぞれの方法がどのように実装されているかを確認することを気にしません。とにかく、ここに以下の文字列があります:

$String = 
"   Port      Name               Status       Vlan       Duplex  Speed Type
    Fa1/0/1   Router 2           connected    trunk        full    100 10/100BaseTX
    Fa1/0/2   User               connected    101          full    100 10/100BaseTX
    Fa1/0/3   User               notconnect   101          full    100 10/100BaseTX
    Fa1/0/4   Video VLAN         connected    503          full    100 10/100BaseTX
    Fa1/0/5   User               notconnect   101          full    100 10/100BaseTX
"

私の Powershell スクリプトの経験は非常に限られているため、( [regex]::splitを使用して) 1 次元配列のみを実行することはほとんどできませんでした。残念ながら、その方法を使用すると、配列に空の項目が発生しました。また、string.split のように [StringSplitOptions]"RemoveEmptyEntries" 機能がないようです。

type int.txt | %{$data = [regex]::split($_, '(\s\s)+')
Write-Output "$($data[0])`t$($data[1])`t$($data[2])`t$($data[3])`t$($data[4])`t$($data[5])`t$($data[6])`t$($data[7])"}

したがって、望ましくない空のアイテムが配列に割り当てられてしまいます。次のような出力で:

                Port            Name             Status
                Fa1/0/1          Router 2                connected
                Fa1/0/2          User            connected
                Fa1/0/3          User            notconnect
                Fa1/0/4          Video VLAN              connected
                Fa1/0/5          User            notconnect

とにかく、文字列をPowershellプロパティや2次元配列に変換する方法を示す専門家のソリューションが本当に欲しいです。前もって感謝します!

4

4 に答える 4

4

固定幅のデータを扱っていて、予測可能な区切り文字で分割できるとは限らない場合は、純粋に列の位置に基づいて解析することをお勧めします。string.substring() メソッドで頻繁に行われることがわかりますが、正規表現を使用できます。個人的には正規表現の方が好きです。次に例を示します。

$string = 
@'
    Port      Name               Status       Vlan       Duplex  Speed Type
    Fa1/0/1   Router 2           connected    trunk        full    100 10/100BaseTX
    Fa1/0/2   User               connected    101          full    100 10/100BaseTX
    Fa1/0/3   User               notconnect   101          full    100 10/100BaseTX
    Fa1/0/4   Video VLAN         connected    503          full    100 10/100BaseTX
    Fa1/0/5   User               notconnect   101          full    100 10/100BaseTX
'@



$regex = '(.{10})(.{19})(.{13})(.{11})(.{8})(.{6})(.+)'

$string.split("`n") -notmatch '\s*Port\s+' |
 foreach {
  if ($_.trim() -match $regex)
   { [PSCustomObject]@{
     Port   = $Matches[1].trim()
     Name   = $Matches[2].trim()
     Status = $Matches[3].trim()
     Vlan   = $Matches[4].trim()
     Duplex = $Matches[5].trim()
     Speed  = $Matches[6].trim()
     Type   = $Matches[7].trim()
    }
   }
  } | ft -AutoSize



Port    Name       Status     Vlan  Duplex Speed Type        
----    ----       ------     ----  ------ ----- ----        
Fa1/0/1 Router 2   connected  trunk full   100   10/100BaseTX
Fa1/0/2 User       connected  101   full   100   10/100BaseTX
Fa1/0/3 User       notconnect 101   full   100   10/100BaseTX
Fa1/0/4 Video VLAN connected  503   full   100   10/100BaseTX
Fa1/0/5 User       notconnect 101   full   100   10/100BaseTX
于 2013-11-07T23:08:56.160 に答える