将字符串拆分为单独的变量

89

我有一个字符串,用代码$CreateDT.Split(" ")把它分割成了几部分。现在我想以不同的方式操纵两个独立的字符串。如何将它们分开并存储到两个变量中?


请参考以下类似问题:https://dev59.com/6Ggu5IYBdhLWcg3wZmQm。 - Michael Freidgeim
6个回答

149

像这样吗?

$string = 'FirstPart SecondPart'
$a,$b = $string.split(' ')
$a
$b

9
如果你有字符串 "FirstPart SecondPart ThirdPart" ,并且只想要前两个部分,你可以使用 $a,$b = $string.split(' ')[0,1] - Stoinov
如果你有 $string = 'FirstPart - SecondPart' 并且 $a,$b = $string.split('-'),添加 ..Trim() ($a,$b = $string.split('-').Trim()),那么 $a 和 $b 都会被修剪。 - mortenma71

56
使用-split运算符创建数组。像这样,
$myString="Four score and seven years ago"
$arr = $myString -split ' '
$arr # Print output
Four
score
and
seven
years
ago

当你需要某个元素时,使用数组索引来访问它。请注意,索引从零开始。像这样:

当您需要特定的项目时,请使用数组索引来获取它。请注意,索引从零开始。例如,

$arr[2] # 3rd element
and
$arr[4] # 5th element
years

6
或者等价于:$arr = @($myString.split(' '))。意思是将字符串 $myString 按照空格分隔成一个数组 $arr - sxc731
2
$first_word = ("one-two-three" -split '-')[0] 可以是一行代码。 - information_interchange
3
@sxc731说:.Split() 总是返回一个数组,所以不需要使用 @(...)$arr = $myString.split(' '),但请注意更符合 PowerShell 习惯的解决方案 $arr = $myString -split ' ' 已经包含在答案中。但请注意,-split 使用正则表达式,并且是不区分大小写的(使用 -csplit 进行区分大小写拆分)。 - mklement0

26

请注意以下两种技术之间的区别:

$Str="This is the<BR />source string<BR />ALL RIGHT"
$Str.Split("<BR />")
This
is
the
(multiple blank lines)
source
string
(multiple blank lines)
ALL
IGHT
$Str -Split("<BR />")
This is the
source string
ALL RIGHT 

从这里可以看出string.split()方法

  • 执行区分大小写的拆分(请注意,"ALL RIGHT"在“R”上拆分,但“broken”没有在“r”上拆分)
  • 将字符串视为可能要拆分的字符列表

-split运算符则:

  • 执行不区分大小写的比较
  • 仅在整个字符串上进行拆分

4
这些是需要指出的好差异; 另一个重要的区别是,-split 命令需要将正则表达式作为其(第一个)右侧操作数,而 [string] 类型的 .Split() 方法则操作于一个明文字符/字符数组,以及在 .NET Core 中也可以是明文字符串。此外,请注意,在 PowerShell 中正确的语法是 $Str -split '<BR />';虽然伪方法语法 $Str -Split("<BR />") 在这种情况下 碰巧地 也有效,但应避免使用。 - mklement0

9

试试这个:

$Object = 'FirstPart SecondPart' | ConvertFrom-String -PropertyNames Val1, Val2
$Object.Val1
$Object.Val2

ConvertFrom-String是更好的解决方案。 需要注意的是,ConvertFrom-String实际上是专门设计用于拆分和对象化信息字符串的,这正是OP所需的。还应该注意到,虽然split命令可以工作,但需要额外的操作才能得到OP所需的内容,而ConvertFrom-String则可以处理这些操作。 - danno
2
@danstermeister:通常,对于简单的字符串分割,使用_cmdlet_效率是低下的。具体来说,“ConvertFrom-String”已经过时,应该避免使用(它总是有一种试验性的感觉,并且它没有包含在 PowerShell Core 中,这表明它不会长期存在)。至于需要额外操作的情况:解构赋值就可以了:$val1, $val2 = 'FirstPart SecondPart' -split ' ' - mklement0
默认情况下,您可以这样做:$Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d ' ' -H Val1,Val2(与Core 6相同);) - Esperento57
1
@mklement0 - PowerShell开发人员由于需要进行后端工作,尚未导入所有面向Windows的项目,但正在逐步实现实际功能的对等性。因此,除非在Windows PowerShell中明确弃用了它,否则我不会将其排除在外。例如,我相信netadapter命令将在不久的将来移植,但今天不存在。目前在Core中的简单缺失绝不是它在Core中存在的预测器。而且,关于cmdlet效率问题,最好让实际的开发人员来处理,而不是路过的脚本编写者。 - danno
@danstermeister:没错,在没有更多信息的情况下,你不能推断出它不会从当前状态移植 - 只能说它不是一个优先事项。然而,这是一个无关紧要的问题,因为ConvertFrom-String所有固有的问题足以避免使用它。这尤其适用于基于模板的解析,但即使是基于分隔符的解析也存在缺陷,由于不可避免地应用了类型推断 - 请参见https://dev59.com/x6vka4cB1Zd3GeqPoBsy#50166580。 - mklement0
@danstermeister:至于替代方案:如上所述,在此类表达式中,-split 是更优秀的选择:-split 'FirstPart SecondPart',最简单的形式 - 没有昂贵的管道和不必要的自定义对象构建。至于管道使用:请关注即将推出的字符串操作 cmdlet - mklement0

0

ForEach-Object 操作语句:

$a,$b = 'hi.there' | foreach split .
$a,$b

hi
there

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接