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

Powershell 大括号、逗号、参数方法调用,powershell,Powershell,我发现很难用谷歌搜索出这两种方法执行方法调用之间的区别: 在上面的示例中,$vals1和$vals2似乎具有相同的结果(一个包含2个元素的数组)。我通常会使用第一种方法,但在示例(同时使用Split和其他方法调用)中,我看到使用了第二种方法 我的问题是,第二个是做什么不同的,使用它有什么好处,我可能不明白 编辑:请不要关注Split方法-我不是在问Split的重载问题 Split方法有多个重载。第二个示例将创建一个字符串数组,该数组将被转换为char[],因为它在双引号中只有一个字符。然而,如

我发现很难用谷歌搜索出这两种方法执行方法调用之间的区别:

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

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



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

Split方法有多个重载。第二个示例将创建一个字符串数组,该数组将被转换为char[],因为它在双引号中只有一个字符。然而,如果你想用两个字符分开,第二个例子就不起作用了,因此我不会使用它

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

$vals1 = $member -split ':'
,“;”
是创建数组的技巧/速记(请尝试
(,“;”).GetType()
)。你为什么需要这个?好吧,让我们尝试直接使用值列表调用
Split

"abc".Split('a','b')
无法将值为“b”的“拆分”参数“计数”转换为类型 “System.Int32”:“无法将值“b”转换为类型“System.Int32”。 错误:“输入字符串的格式不正确。”

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

"abc".Split((,'a','b'))
无法转换值为“System.Object[]”的参数“separator”, 对于“拆分”为“System.Char[]”的类型:“:”无法转换 “System.Object[]”类型的值“System.Object[]”要键入 “System.Char”

不,因为我们仍然存在类型不匹配。这是因为这种方法太聪明了。创建数组的可读性更高的方法是
@()
运算符:

"abc".Split(@('a', 'b'))
这将调用所需的
Split

重载,用作一元数就是您看到的。这是一种创建数组的简写方法。PowerShell将在管道中展开阵列,这通常是理想的标准行为。我认为这通常用于限制PowerShll的功能

尽管不希望PowerShell展开整个数组,但在某些情况下,您会通过该数组前面的逗号一元运算符执行此操作。考虑产出差异

使用正则数组表示法 使用一元运算符创建锯齿状数组 在第二个示例中,数组作为一个整体传递。PowerShell仍然将它从一个具有一个元素的单个数组展开到该单个数组1,2,3


也有其他情况可供使用。我通常会看到使用
1,2,3
静态声明规则数组,或者有时需要使用
@()
。这两种方法的结果是相同的

谢谢你的回答,但这并不是关于方法
Split
-这只是一个例子,我看到这个语法使用了
(,“x”)
好的,所以我部分跟随你-我尝试了
(,“;”).GetType()
并得到了一个
对象[]
。但老实说,当我开始关注
Split
的重载时,这个答案让我不知所措。我试图理解为什么有人会在方法调用中使用该方法
(,$someParam)
general@Jamiec:防止。一般来说,你不会(不应该)这样做,因为,嗯,这是一个愚蠢的习惯。但展开是一件有时会产生干扰的事情,在前面加一个逗号是一种快速而肮脏的防止方法。(或者更确切地说,为展开添加另一个关卡。)我不会称之为每sei的技巧。它使用一元运算符来减轻阵列的PowerShell展开。我想我遗漏了一些关于powershell工作原理的基本知识。我非常习惯.NET的开发,但有些东西我还不了解。例如,
(“a”,“b”)
也给了我一个数组。空白第一个元素有什么特别之处?看起来好像是有人对kewl haxorz加速的想法。其实没什么区别。
"abc".Split(@('a', 'b'))
$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[]