将非原生powershell命令视为对象?

时间:2015-12-08 17:49:36

标签: powershell

我正在尝试过滤运行netsh命令的结果以检索某个值。

PS C:\windows\system32> netsh interface ipv4 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          50  4294967295  connected     Loopback Pseudo-Interface 1
 12          25        1500  connected     Wireless Network Connection
 11          10        1500  connected     Local Area Connection
 14          40        1500  disconnected  Bluetooth Network Connection
 21          20        1500  connected     VMware Network Adapter VMnet1
 22          20        1500  connected     VMware Network Adapter VMnet8

我想检索本地连接的Idx值。

将上面的netsh命令管道到Where-Object似乎不起作用。

将一个变量分配给上面的netsh命令,将其视为一个似乎无法正常工作的对象。

我怎样才能做到这一点?

谢谢!

基于以下答案并且围绕这个是我提出的解决方案,不是很漂亮,但它有效。我不得不怀疑是否有一个我可以使用的.NET等价物,但是我将其保存以供日后使用。谢谢你的帮助。

$interfaces = netsh interface ipv4 show interfaces

foreach ($i in $interfaces) 
{
    if ($i -match 'Local Area Connection') {
    $indexvalue = $i.Substring(0,6)
    $indexvalue = $indexvalue.Trim()
    Write-Host $indexvalue
    }
}

1 个答案:

答案 0 :(得分:2)

好吧,你至少表明(在评论中,你应该更新了问题,但我们会让那张幻灯片)你写了代码并且你确实尝试过。所以,让我们为你提供你想要的东西......

$IDX = netsh interface ipv4 show interfaces | Where {$_ -match "(\d+).*?Local Area Connection"}|ForEach{$Matches[1]}

这可以让你满意。我个人会做的是为每个条目获取对象,以防您以后想要使用其他记录,或者稍后使用其他信息......

$Connections = netsh interface ipv4 show interfaces | Select-Object -Skip 2 | Where {$_ -match "(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S.*)$"} | ForEach{
[PSCustomObject]@{
    'Idx'=$Matches[1]
    'Met'=$Matches[2]
    'MTU'=$Matches[3]
    'State'=$Matches[4]
    'Name'=$Matches[5]
}}

然后你有一个对象数组,每个对象将有5个属性与netsh输出的表匹配。有关RegEx匹配的更多信息,请查看www.RegEx101.com处的说明。然后,如果您想要本地连接的IDX,您可以执行以下操作:

$Connections |Where{$_.Name -eq 'Local Area Connection'}|Select -Expand IDX

我承认你正在做的事情有点过分,但是使用对象代替字符串可能会很有用,而理解这种方法可以让你在将来完成更多的事情。