如何在“ string []”变量前添加“ string”?

时间:2019-05-22 19:03:02

标签: powershell

假设我有一个PowerShell函数,该函数返回[string[]]

function do_something() {
    [string[]]$str_array = @("one", "two", "three")
    return $str_array
}

$x = do_something()

# doesn't work
$y = @("something", $x)

现在,我想在[string[]]列表的前面添加一个字符串。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

有多个ways连接两个数组。关于上述评论中的问题:

  

这很有趣,我没有意识到“,”和“;”是不同的形成列表时...

在PowerShell中,,是一个自己的运算符,在一元或二进制语句中使用时,其行为会有所不同。

来自about_operators

  

作为二进制运算符,逗号创建一个数组。作为一元运算符,逗号创建一个包含一个成员的数组。将逗号放在成员之前。

在代码@("something", $x)中,您以二进制形式使用运算符。因此,将创建一个具有两个条目的新数组。第一个条目是字符串“ something”,第二个条目包含字符串数组。那是因为PowerShell将其解释为:“好吧,我将创建一个具有两个条目的新数组(=“ something”,以及指向数组的引用)。

我们可以在帮助或Get-Member的帮助下进行检查:

C:\> $y | Get-Member          


TypeName: System.String
    Name             MemberType            Definition
    ----             ----------            ----------
    Clone            Method                System.Object Clone(), System.Object ICloneable.Clone()
    ...


    TypeName: System.Object[]
    Name           MemberType            Definition
    ----           ----------            ----------
    Add            Method                int IList.Add(System.Object value)
    ...

可以看出,Get-Member显示使用两个TypeName。第一个是字符串,第二个是数组。

将代码更改为@("something"; $x)时,不再使用,运算符。取而代之的是,由于使用了命令分隔符(= {;),因此代码现在分成了大约三个“命令”。

  • Cmd1:“某物”
  • Cmd2:$ x->转储数组内容
  • Cmd3:@()->确保括号内的表达式作为数组返回。

您还可以删除命令分隔符并在多行中定义$y

PS C:\>$y = @("something"
>>>      $x
>>>     )

不要太含糊,我建议按以下方式合并两个数组:

    PS C:\> $a = 1
    PS C:\> $b = @(2,3,4)
    PS C:\> $c = @()
    PS C:\> $c += $a
    PS C:\> $c += $b
    PS C:\> $c
    1
    2
    3
    4
    PS C:\> $c | gm


    TypeName: System.Int32
    Name        MemberType Definition
    ...

当然,它是“更多”的代码,但是其模棱两可。

希望有帮助。