【问题标题】:How do I concatenate values in PowerShell?如何在 PowerShell 中连接值?
【发布时间】:2018-12-21 02:21:58
【问题描述】:

我正在尝试使用 PowerShell 解析一些 DNS 记录。除了我尝试附加“owa”的方法之外,所有 Resolve-DnsName 方法都可以在下面使用。到域名的开头。我得到的最新错误是“无法验证参数名称上的参数”。我尝试了各种组合但没有运气(即 owa.$Domain.Name)。连接这些值以实现成功的 DNS 解析的正确方法是什么?

$Domain = New-Object System.Object
$Domain | Add-Member -type NoteProperty -name MXRecord -value $MXQuery
$Domain | Add-Member -type NoteProperty -name Name -value "mydomain.com"
$MXQueryRecord = Resolve-DnsName $Domain.Name -type MX -Server 8.8.8.8
$OWAQuery = Resolve-DnsName $("owa.")-$($Domain.Name) -type CNAME -Server 8.8.8.8
$TXTQuery = Resolve-DnsName $Domain.Name -type TXT -Server 8.8.8.8
$NSQuery = Resolve-DnsName $Domain.Name -type NS -Server 8.8.8.8

$Queries =$($MXQuery,$OWAQuery,$TXTQuery,$NSQuery)

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试着这样写

    $OWAQuery = Resolve-DnsName "owa.-$($Domain.Name)" -type CNAME -Server 8.8.8.8
    

    (如果我正确理解它应该看起来像:owa.-somedomainname; 因为破折号似乎是多余的,所以如果不需要就删除它)

    【讨论】:

      【解决方案2】:

      使用(...) 将表达式的值/命令的输出作为命令参数传递t:

      Resolve-DnsName ("owa." + $Domain.Name) -type CNAME -Server 8.8.8.8
      

      注意:$(...), the subexpression operator,仅当您尝试传递的内容包含 多个 语句时才需要。 @(...), the array-subexpression operator,仅当您需要保证输出被视为 array 时才需要,即使只输出单个对象。

      (...)$(...)@(...)具有使用任何数据类型的优势,而不仅仅是字符串。

      或者,如果您传递的是 字符串(如本例所示),您可以使用 字符串扩展(插值),如Drako's answer所示。


      至于你尝试了什么

      $("owa.")-$($Domain.Name)

      被 PowerShell 解析为 两个 参数:

      • 子表达式$("owa."),计算结果为字符串文字owa.
      • 可扩展字符串-$($Domain.Name),其计算结果为-<domain-name>(作为可扩展字符串的计算意味着它的计算方式与您明确双引号该标记("-$($Domain.Name)")时的计算方式相同)。

      当 PowerShell 将复合标记分解为 多个 参数时,并不总是很明显;行为总结here.
      要了解一般如何将不带引号的标记解析为参数,请参阅this answer

      请注意,如果您有双引号您的整个令牌 ("$("owa.")-$($Domain.Name)"),您的命令也会起作用(但不需要嵌入通过$(...) 的字符串文字
      要了解有关可扩展字符串(字符串插值)的更多信息,请参阅this answer

      【讨论】:

      • 您不需要串联,因为不必要地消耗额外的(在这种情况下甚至很少)CPU 功率。
      • @Drako 相当肯定子表达式比较慢,但是在处理小集合字符串时这些都不重要
      • @Drako:我怀疑这是一个现实世界的问题,而且和 TheIncorrigible1 一样,我猜字符串插值是更慢。也就是说,在这种情况下,字符串插值是一个可行的选择,所以我添加了一个链接到你的答案。我选择展示(...),因为它适用于任何类型的参数,而不仅仅是字符串
      • 我没有在 PowerShell 中为此做过这样的测试,所以不会争论:)。 (在 C++ 和 Python 中做过类似的测试;我的方法减少了 CPU 指令,所以我在这里假设相同,但显然我的猜测可能是错误的,因为 PS 解析字符串的方式不同:))
      • 感谢您的信息。我会考虑到这一点,知道 PS 具有非常复杂的字符串解析机制并不奇怪。
      猜你喜欢
      • 2021-10-24
      • 2020-10-01
      • 2020-11-06
      • 2017-12-14
      • 1970-01-01
      • 2013-02-13
      • 2012-02-03
      • 1970-01-01
      • 2019-10-08
      相关资源
      最近更新 更多