首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell对象的netsh结果

PowerShell对象的netsh结果
EN

Stack Overflow用户
提问于 2014-11-15 07:48:54
回答 3查看 5.9K关注 0票数 2

我正试图与来自PowerShell的PowerShell合作。我希望看到这个命令的结果,比如一个对象,但是netsh返回一个字符串:

代码语言:javascript
复制
netsh wlan show hostednetwork | Get-Member
   TypeName: System.String
...

我的脚本必须在具有相当本地化的系统上工作,并且不能使用-match直接将字符串解析为对象。

我怎么才能解决我的麻烦?

EN

回答 3

Stack Overflow用户

发布于 2016-03-01 02:47:02

代码语言:javascript
复制
$netshResult = Invoke-Command -Computername localhost {netsh int tcp show global}
$result = @{}
$netshObject = New-Object psobject -Property @{
    ReceiveSideScalingState = $Null
    ChimneyOffloadState = $Null
    NetDMAState = $Null
} 
$netshResult = $netshResult | Select-String : #break into chunks if colon  only
$i = 0
while($i -lt $netshResult.Length){
    $line = $netshResult[$i]
    $line = $line -split(":")
    $line[0] = $line[0].trim()
    $line[1] = $line[1].trim()
    $result.$($line[0]) = $($line[1])
    $i++
    }
$netshObject.ReceiveSideScalingState = $result.'Receive-Side Scaling State'
$netshObject.ChimneyOffloadState = $result.'Chimney Offload State'
$netshObject.NetDMAState = $result.'NetDMA State'
票数 4
EN

Stack Overflow用户

发布于 2014-11-15 08:22:20

你有几个选择,没有一个是好的。

1)将netsh输出读入string[],并使用自定义记录解析器创建自己的对象。也就是说,查看不同区域设置上的输出,找出Hosted newtork settings是否总是第一个标头,后面跟着一串-字符。如果是这样的话,假设数组中的下一个元素是Mode等等。这很容易出错,但通常MS命令行工具只翻译消息,而不是它们的顺序。

2)查找.Net API中的相同信息。有一个System.Net.NetworkInformation,它包含了一堆连接的东西。这是一个开始,虽然我不确定它是否有你需要的信息。

3)如果前面的选项失败,请使用P/调用调用本地Win32 API。这需要大量的工作,所以在滚动您自己的包装库之前,请先查找已有的包装器库。

票数 2
EN

Stack Overflow用户

发布于 2014-12-12 05:16:09

最近,我编写了一个cmdlet来使用正则表达式解析任意的多行文本,称为ConvertFrom-Text。(如果您问我,这不是一个好名字,但它符合PowerShell命名规则;欢迎提出建议!)假设你有那个cmdlet,这里有一个可能的解决方案。(请注意,清空者!给出的正则表达式是从一个非常小的netsh输出样本中导出的,因此可能需要进行一些调优。)

代码语言:javascript
复制
$regex = [regex] '(?ms)(?:^\s*$\s*)?^(?<section>.*?)\s*-+\s*(?<data>.*?)\s*^\s*$'
$result = netsh wlan show hostednetwork | Out-String |
    ConvertFrom-Text -pattern $regex -multiline
$result | % {
    $dataObj = [PsCustomObject]@{}
    $_.Data -split "`r`n" | % {
        $element = $_ -split '\s*:\s*'
        Add-Member -InputObject $dataObj -MemberType NoteProperty -Name $element[0].Trim() -Value $element[1].Trim()
    }
    $_.Data = $dataObj # Replace data text with data object
}
$result

在我的测试系统中,netsh wlan show hostednetwork返回以下内容:

代码语言:javascript
复制
Hosted network settings
-----------------------
    Mode                   : Allowed
    Settings               : <Not configured>

Hosted network status
---------------------
    Status                 : Not available

上面代码中的$result变量的输出结果如下:

代码语言:javascript
复制
section                   data
-------                   ----
Hosted network settings   @{Mode=Allowed; Settings=<Not configured>}
Hosted network status     @{Status=Not available}

因此,$result是一个具有sectiondata属性的对象数组,后者是一个具有由netsh命令的输出定义的属性的对象。

当然,如果没有ConvertFrom-Text cmdlet,上面的内容不会对您有很大帮助。下面是实现。(我有丰富的文档和示例,一旦我最终将它添加到开源PowerShell库中,这些文档和示例就会公开。)

代码语言:javascript
复制
filter ConvertFrom-Text
{
    [CmdletBinding()]
    Param (
    [Parameter(Mandatory=$true,Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
    [string[]]$InputObject,

    [Parameter(Mandatory=$true,Position=1)]
    [regex]$Pattern,

    [switch]$RequireAll,
    [switch]$Multiline
    )

    if ($Multiline) {
        $dataString = $InputObject -join "`n"
        IterateByMatch $dataString $Pattern
    }
    else {
        IterateByLine $InputObject $Pattern
    }
}

function IterateByLine([string[]]$data, [regex]$regex)
{
    $data | ForEach-Object {
        if ($PSItem -match $regex)
        {
            New-Object PSObject -Property (GetRegexNamedGroups $matches)
        }    
        elseif ($RequireAll) {
            throw "invalid line: $_"
        }
    }
}  

function IterateByMatch([string[]]$data, [regex]$regex)
{
  $regex.matches($data) | Foreach-Object {
    $match = $_
    $obj = new-object object
    $regex.GetGroupNames() |
    Where-Object {$_ -notmatch '^\d+$'} |
    Foreach-Object {
      Add-Member -InputObject $obj NoteProperty `
          $_ $match.groups[$regex.GroupNumberFromName($_)].value
    }
    $obj
  }
}

function Get-RegexNamedGroups($hash)
{
    $newHash = @{};
    $hash.keys | ? { $_ -notmatch '^\d+$' } | % { $newHash[$_] = $hash[$_] }
    $newHash 
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26943777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档