【问题标题】:How to expand (interpolate) an array element in a string [duplicate]如何扩展(插入)字符串中的数组元素[重复]
【发布时间】:2021-08-12 11:05:21
【问题描述】:

这对某人来说肯定是随和的。当我在字符串中引用数组项时,它不会产生所需的结果。我希望最后一条语句产生一个包含“abc”的字符串,但它没有。

PS C:\src\powershell> $mylist = @("abc", "def")
PS C:\src\powershell> $mylist
abc
def
PS C:\src\powershell> $mylist[0]
abc
PS C:\src\powershell> $mylist[1]
def
PS C:\src\powershell> "$mylist[0]"
abc def[0]s

【问题讨论】:

    标签: powershell string-interpolation


    【解决方案1】:

    注意:虽然此答案涵盖了 PowerShell 中字符串插值的许多方面,但可以在 this answer 中找到对该主题的更全面处理。

    在双引号字符串中嵌入变量引用时,只能嵌入简单的变量引用,而不用将表达式括在所谓的子表达式运算符$(...)中:

    PS> $mylist = @("abc", "def") # define an array
    
    PS> "$mylist[0]" # WRONG: $mylist (the whole array) is expanded, and "[0]" is a literal.
    abc def[0]
    
    PS> "$($mylist[0])" # OK: $(...) ensures that the subscript is recognized.
    abc
    

    更准确地说,您可以直接嵌入以下变量引用双引号字符串/here-strings 为了让它们扩展(插值):

    • 一个仅按名称引用的变量;例如,"I'm $HOME."
    • 带有范围说明符的变量;例如,"I'm on a spiritual $env:PATH."

    区分变量名与后续字符,将其括在{...}中;例如,
    "I'm ${HOME}:"
    请注意,如果没有 {...},最终的 : 将被解释为变量名的一部分,并会导致错误。
    或者,您可以将: 转义为`:,类似地,使用`$ 转义(创建一个文字$

    对于其他一切,包括访问数组变量的下标对象变量的property,您需要子表达式运算符$(...)
    请注意,$(...) 允许您在字符串中嵌入整个命令行;例如:

    PS> "Today is $((Get-Date).ToString('d'))."
    Today is 10/13/16.                         # en-US culture
    

    文档说明:Get-Help about_Quoting_Rules 涵盖了字符串插值,但从 PSv5 开始,并不深入。


    对于替代字符串插值(扩展)构建字符串,请参阅Ansgar Wiecher's answer

    【讨论】:

      【解决方案2】:

      当扩展字符串中的变量时,PowerShell 无法识别更复杂的变量构造(例如索引操作 ($mylist[0]) 或属性/方法访问 ($mylist.Count))。它将简单地扩展变量并保留字符串的其余部分。因此表达式"$mylist[0]" 变为"abc def[0]"

      基本上你有三个选项来处理这个限制:

      当然还有更多“异国情调”的方法,比如使用-join 运算符:

      "-", $mylist[0], "-" -join ""
      

      或替换操作:

      '-%x%-' -replace '%x%', $mylist[0]
      '-%x%-'.Replace('%x%', $mylist[0])
      

      但那些已经接近混淆了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2019-07-18
        相关资源
        最近更新 更多