大括号,逗号,参数方法调用

时间:2016-09-28 11:14:10

标签: powershell

我发现很难回答这两种执行方法调用的方式之间的区别:

$member = "1.2.3.4:567" # IPaddress + port for demonstration
$vals1 = $member.Split(":") # typical .NET way of executing String.Split
$vals2 = $member.Split( (,":") ) # something else which ive seen in examples which I dont understand

在上文中,$vals1$vals2似乎具有相同的结果(具有2个元素的数组)。我通常会使用第一种方式,但在示例中(使用Split和其他方法调用)我看到第二种方法。

我的问题是第二个做的是不同的,使用它有什么好处,我可能不明白?

编辑:请不要关注Split方法 - 我不是在问Split的重载!

3 个答案:

答案 0 :(得分:4)

作为一元使用的comma operator就是你所看到的。它是创建数组的简便方法。 PowerShell将在管道中展开通常需要的数组和标准行为。我看到这个常用的方法是改进PowerShll的这个功能

在某些情况下你会做什么虽然你不希望PowerShell展开整个数组是通过该数组的逗号一元运算符。考虑输出的差异

使用常规数组表示法

$array = 1,2,3
$array.Count
$array | ForEach-Object{$_.GetType().FullName}

3
System.Int32
System.Int32
System.Int32

使用一元运算符创建锯齿状数组

$commaArray = ,@(1,2,3)
$commaArray.Count
$commaArray | ForEach-Object{$_.GetType().FullName}

1
System.Object[]

在第二个例子中,数组作为一个整体传递。 PowerShell仍然从单个数组中展开它,其中一个元素本身就是该单个数组1,2,3的数组。

还有其他案例可供使用。我更常见的是使用1,2,3静态声明的常规数组,或者有时需要@()。两者的结果相同。

答案 1 :(得分:1)

,";"是创建数组的技巧/简写(尝试(,";").GetType())。你为什么需要这个?好吧,让我们直接尝试使用值列表调用Split

"abc".Split('a','b')
  

无法转换参数" count",带值:" b",for" Split"输入   " System.Int32":"无法转换价值" b"输入" System.Int32"。   错误:"输入字符串的格式不正确。""

不起作用,因为参数是单独传递的,而不是char[]。那么我们可以使用逗号技巧来解决这个问题吗?

"abc".Split((,'a','b'))
  

无法使用值转换参数" separator"," System.Object []",   for" Split"键入" System.Char []":"无法转换   " System.Object的[]" type" System.Object []"输入   " System.Char""

不,因为我们仍然存在类型不匹配。那是因为这种方法对自己的好处太聪明了。创建数组的更易读的方法是@()运算符:

"abc".Split(@('a', 'b'))

这会调用Split所需的重载。

答案 2 :(得分:0)

Split方法有多个重载。第二个例子将创建一个字符串数组,它将转换为char [],因为它只是双引号中的一个字符。但是,如果你想分成两个字符,那么第二个例子就不会起作用,因此我不会使用它。

但是,PowerShell的拆分方法是使用-split

$vals1 = $member -split ':'