1

PS をいじってみると、簡単なスクリプトができました。

ipconfig /all | where-object {$_ -match "IPv4" -or  $_ -match "Description"}

これは素晴らしく、私が期待することを行います。私がやりたいことは、先読みして、IPv4 行の前の説明のみを表示することです。または、逆検索して ipv4 と次の説明を取得し、次の IPv4 などを探します。

配列を作成してスピンしてから、配列をスピンして意味のある部分を抽出することなく、これを行う方法はありますか?

私のラップトップでこのコマンドを実行すると、次のようになります。

Description . . . . . . . . . . . : Microsoft Virtual WiFi Miniport Adapter
Description . . . . . . . . . . . : Killer Wireless-N 1103 Network Adapter
IPv4 Address. . . . . . . . . . . : 192.168.1.2(Preferred) 
Description . . . . . . . . . . . : Atheros AR8151 PCI-E Gigabit Ethernet Controller (NDIS 6.20)
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
IPv4 Address. . . . . . . . . . . : 192.168.122.1(Preferred) 
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
IPv4 Address. . . . . . . . . . . : 192.168.88.1(Preferred) 
Description . . . . . . . . . . . : Microsoft ISATAP Adapter
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #2
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #3
Description . . . . . . . . . . . : Teredo Tunneling Pseudo-Interface
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #4
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #5

私が欲しいのは:

Description . . . . . . . . . . . : Killer Wireless-N 1103 Network Adapter
IPv4 Address. . . . . . . . . . . : 192.168.1.2(Preferred) 
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
IPv4 Address. . . . . . . . . . . : 192.168.122.1(Preferred) 
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
IPv4 Address. . . . . . . . . . . : 192.168.88.1(Preferred) 
4

3 に答える 3

2

IPv4 対応アダプターのすべての説明を抽出したい場合は、次のようにしてみてください。

ipconfig /all | Select-String "IPv4" -AllMatches -SimpleMatch -Context 5 | % {
    $_.Context.Precontext -match "Description" -replace 'Description(?:[^:]+):(.*)$', '$1'
}
    Intel(R) 82579V Gigabit Network Connection

あなたのコードでそれを取得するには、これを試してください:

ipconfig /all | where-object {
    $_ -match "IPv4" -or  $_ -match "Description"
} | Select-String "IPv4" -SimpleMatch -AllMatches -Context 1 | % { 
    $_.context.precontext -replace 'Description(?:[^:]+):(.*)$', '$1'
}

編集申し訳ありませんが、以前のようにあなたの質問を読み違えました。あなたは説明だけが欲しいと思っていました。これは、IPv4 アクティブ アダプタの説明と IP ラインを示しています。

ipconfig /all | Select-String "IPv4" -AllMatches -SimpleMatch -Context 5 | % {
    $_.Context.Precontext -match "Description"
    $_.Line
}

Description . . . . . . . . . . . : Intel(R) 82579V Gigabit Network Connection
IPv4 Address. . . . . . . . . . . : xx.xx.xx.xx(Preferred) 
于 2013-02-21T08:16:50.363 に答える
1

出力で見つかった最後の説明を単に追跡する別のオプション:

switch -regex ( ipconfig /all ) { 'IPv4' { $d + $_ } 'Description' { $d = @($_) } }


また、-match比較演算子は、単一の文字列だけでなく配列でも機能します。なので使うのは、一行一行を個別にチェック(ipconfig /all) -match 'IPv4|Description'するオリジナルに相当します。ipconfig /all | where { $_ -match 'IPv4' -or $_ -match 'Description' }

于 2013-03-02T15:32:20.723 に答える
1

代替ソリューション:

[regex]$regex = '(?ms)^\s*(Description[^\r]+\r\n\s*IPv4[^\r]+)\r'
$regex.matches(((ipconfig /all) -match '^\s*Description|IPv4') -join "`r`n") |
foreach {$_.groups[1].value -replace '\. ',''}
于 2013-02-21T11:15:24.143 に答える