powershell 大括号、逗号、参数方法调用

at0kjp5o  于 2022-11-10  发布在  Shell
关注(0)|答案(3)|浏览(156)

我发现很难在Google上搜索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的重载!

ou6hu8tu

ou6hu8tu1#

Split方法有多个重载。第二个示例将创建一个字符串数组,该数组将被转换为char[],因为它在双引号中只有一个字符。但是,如果您想要拆分为两个字符,则第二个示例将不起作用,因此我不会使用它。
但是,PowerShell的拆分方式是使用-split

$vals1 = $member -split ':'
mqkwyuun

mqkwyuun2#

用作一元的逗号操作符就是您所看到的。这是创建数组的一种快捷方式。PowerShell将在管道中展开阵列,这通常是所需的和标准行为。在我看来,这通常是为了缓解PowerShell的这一特性
然后,在某些情况下,您将通过该数组前面的逗号一元运算符来展开整个数组,尽管您不希望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静态声明的常规数组,或者有时需要使用@()。这两种情况的结果是相同的。

zujrkrfu

zujrkrfu3#

,";"是创建数组的诀窍/速记(试试(,";").GetType())。你为什么需要这个?那么,让我们尝试直接使用值列表调用Split

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

无法将“Split”的参数“count”(值为“b”)转换为类型“System.Int32”:“无法将值”b“转换为类型”System.Int32“。错误:”输入字符串的格式不正确。“”
不起作用,因为参数是单独传递的,而不是作为char[]传递的。那么,我们可以使用逗号技巧来解决这个问题吗?

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

无法将“Split”的参数“Separator”(值为“System.Object[]”)转换为类型“System.Char[]”:“无法将类型为”System.Object[]“的”System.Object[]“值转换为类型”“System.Char”“。”
不,因为我们仍然有一个类型不匹配。这是因为这种方法太聪明了,不利于自身的利益。创建数组的一种更具可读性的方法是@()操作符:

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

这就调用了所需的Split重载。

相关问题