如何扩展变量中的属性

dca*_*caz 3 powershell

如果我走

$c = Resolve-DnsName facebook.com -Type TXT -Server '8.8.8.8'
Run Code Online (Sandbox Code Playgroud)

当我进入时$c我得到

Name                                     Type   TTL   Section    Strings
----                                     ----   ---   -------    -------
facebook.com                             TXT    7200  Answer     {v=spf1 redirect=_spf.facebook.com}        
facebook.com                             TXT    7200  Answer     {google-site-verification=A2WZWCNQHrGV_TW  
                                                                 wKh6KHY90tY0SHZo_RnyMJoDaG0s}
facebook.com                             TXT    7200  Answer     {google-site-verification=wdH5DTJTc9AYNwV  
                                                                 unSVFeK0hYDGUIEOGb-RReU6pJlY}
Run Code Online (Sandbox Code Playgroud)

我该如何扩展$c.strings

我知道我可以得到扩展的字符串并失去其余的

Resolve-DnsName facebook.com -Type TXT -Server '8.8.8.8' | Select-Object -ExpandProperty strings
Run Code Online (Sandbox Code Playgroud)

如何扩展整个答案?

San*_*zon 8

您可以使用计算属性将Strings 属性从重新定义string[]string

Resolve-DnsName google.com -Type TXT -Server '8.8.8.8' |
    Select-Object Name, Type, TTL, Section, @{ N = 'Strings'; E = { [string] $_.Strings }} |
        Format-Table
Run Code Online (Sandbox Code Playgroud)

这将导致:

Name         Type    TTL   Section   Strings           
----         ----    ---   -------   -------           
google.com    TXT   3600    Answer   docusign=05958488-....
google.com    TXT   3600    Answer   google-site-verifi....
google.com    TXT   3600    Answer   docusign=1b0a6754-....
google.com    TXT   3600    Answer   google-site-verifi....
google.com    TXT   3600    Answer   globalsign-smime-d....
google.com    TXT   3600    Answer   MS=E4A68B9AB2BB967....
google.com    TXT   3600    Answer   apple-domain-verif....
google.com    TXT   3600    Answer   v=spf1 include:_sp....
google.com    TXT   3600    Answer   facebook-domain-ve....
Run Code Online (Sandbox Code Playgroud)

如果 Strings 属性中有多个字符串,则使用上面的代码将使用$OFS(Out Field Separator)连接字符串,默认情况下是一个空格

Name         Type    TTL   Section   Strings
----         ----    ---   -------   -------
google.com    TXT   3339    Answer   docusign=4752-4e...   docusign=4752-4e...
Run Code Online (Sandbox Code Playgroud)

如果您想要多行字符串,则可以使用Out-String,但这需要首先.Trim()输出并使用-WraponFormat-Table才能正确显示。

使用硬编码值 ( ) 的代码示例docusign=05958488

Resolve-DnsName google.com -Type TXT -Server '8.8.8.8' |
    Select-Object Name, Type, TTL, Section, @{
        Name       = 'Strings'
        Expression = { ('docusign=05958488', 'docusign=05958488' | Out-String).Trim() }
    } | Format-Table -Wrap
Run Code Online (Sandbox Code Playgroud)

您还可以使用-join运算符将​​字符串与CRLF( `r`n) 连接起来以获得多行字符串

Resolve-DnsName google.com -Type TXT -Server '8.8.8.8' |
    Select-Object Name, Type, TTL, Section, @{
        Name       = 'Strings'
        Expression = { 'docusign=05958488', 'docusign=05958488' -join "`r`n" }
    } | Format-Table -Wrap
Run Code Online (Sandbox Code Playgroud)

这两个例子的结果是:

Name         Type    TTL   Section   Strings
----         ----    ---   -------   -------
google.com    TXT   3574    Answer   docusign=05958488
                                     docusign=05958488
google.com    TXT   3574    Answer   docusign=05958488
                                     docusign=05958488
google.com    TXT   3574    Answer   docusign=05958488
                                     docusign=05958488
Run Code Online (Sandbox Code Playgroud)

如果您想要一种可以处理两种情况的解决方案,即只有一个值的字符串和具有多个值的字符串,您可以使用如下所示的方法:

$result = Resolve-DnsName google.com -Type TXT -Server '8.8.8.8'
# Add random values to Strings for testing
$result.ForEach({ $_.Strings += Get-Random })
# Code logic
$result = foreach($element in $result) {
    $out = [ordered]@{
        Name    = $element.Name
        Type    = $element.Type
        TTL     = $element.TTL
        Section = $element.Section
    }

    foreach($e in $element.Strings) {
        $out.Strings = $e
        # output one object per string
        [pscustomobject] $out
    }
}

$result | Format-Table
Run Code Online (Sandbox Code Playgroud)

上述逻辑将在 Strings 属性中为每个元素创建一个新对象。输出将是:

TTL   Section  Name       Type   Strings
---   -------  ----       ----   -------
3444  Answer   google.com  TXT   apple-domain-verificatio...
3444  Answer   google.com  TXT   1419241945              
3444  Answer   google.com  TXT   MS=E4A68B9AB2BB9670BCE15...
3444  Answer   google.com  TXT   463070462               
3444  Answer   google.com  TXT   facebook-domain-verifica...
3444  Answer   google.com  TXT   958788674               
3444  Answer   google.com  TXT   google-site-verification...
3444  Answer   google.com  TXT   1623605637              
Run Code Online (Sandbox Code Playgroud)