TheMadTechnician 在对该问题的评论中提供了关键指针:
使用-split 运算符,它在 PSv2 中的工作方式相同:它需要一个 正则表达式(正则表达式)作为分隔符,允许比[string] 类型的.Split() 方法,对文字进行操作:
PS> 'One, Two, Three' -split ',\s*' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
正则表达式 ,\s* 用逗号分隔输入字符串,后跟零个或多个 (*) 空白字符 (\s)。
事实上,choosing -split over .Split() is advisable in general,甚至在更高版本的 PowerShell 中。
但是,要完全等同于问题中基于 .Trim() 的解决方案,还需要修剪前导和尾随空格:
PS> ' One, Two,Three ' -split ',' -replace '^\s+|\s+$' | ForEach-Object { "[$_]" }
[One]
[Two]
[Three]
-replace '^\s+|\s+$' 从拆分产生的每个标记中删除前导和尾随空格:| 指定 alternation 以便将其两侧的子表达式视为匹配; ^\s+, 匹配前导空格,\s+$ 匹配尾随空格; \s+ 表示非空(一个或多个,+)空格字符;有关-replace 运算符的更多信息,请参阅this answer。
(在 PSv3+ 中,您可以简化为 (' One, Two,Three ' -split ',').Trim() 或使用问题中的解决方案。)
至于为什么('One, Two, Three'.Split(',')).Trim() 在 PSv2 中不起作用:.Split() 方法返回一个 array 标记,并在该数组上调用 .Trim() 方法 - 而不是它的元素- PSv2 不支持。
在 PSv3+ 中,.Trim() 方法调用被隐式“转发”到结果数组的 元素,从而实现对单个标记的所需修剪 - 此功能称为 member enumeration。