我发现很难回答这两种执行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
的重载!
答案 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 ':'