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


Answers:


139

像这样?

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

7
如果您"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

51

-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(' '))
-sxc731

2
也可以是单线:$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731:.Split()总是返回一个数组,因此不需要@(...)$arr = $myString.split(' '),但是请注意,更多PowerShell惯用的解决方案$arr = $myString -split ' '已经是答案的一部分。但是请注意,它-split需要一个正则表达式并且不区分大小写(-csplit用于区分大小写的拆分)。
mklement0 '18 -10-17

25

重要的是要注意两种技术之间的以下区别:

$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正则表达式(正则表达式)作为其(第一个)RHS操作数,而该[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 Commandlet可以工作,但它需要进行额外的操作才能获得OP所需的内容,而ConvertFrom-String可以解决这一问题。
丹诺

1
@danstermeister:通常,使用cmdlet进行简单的字符串拆分效率低下。具体来说,它ConvertFrom-String已过时,应避免使用(它始终具有实验意义,并且尚未将其包含在PowerShell Core中,因为后者将集中在将来的开发工作上,这表明它不再存在)。至于需要额外的操纵:销毁工作将:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0 '18

默认情况下,您可以执行以下操作:$ Object ='FirstPart SecondPart'| ConvertFrom-Csv -d''-H Val1,Val2(与Core 6相同;)
Esperento57 '18 -10-18

1
@ mklement0-由于需要进行后端工作,因此PowerShell开发人员到目前为止尚未导入所有以Windows为中心的项目,但是为了实现实际的功能奇偶校验,正在减慢其实现速度。因此,除非在Windows Powershell中专门弃用了它,否则不必将其排除在外。例如,我相信netadapter命令将在不久的将来移植,但是今天不存在。目前在Core中只是缺席,绝对无法预测它将来在Core中是否存在。cmdlet效率问题最好留给实际开发人员,而不是急切的脚本编写者。
danno

@danstermeister:是的,在没有更多信息的情况下,您不能推断它不会从当前的缺席中移植出来-只是它不是优先级。但是,这是有争议的,因为所有ConvertFrom-String固有问题都是有理由避免的。这尤其适用于基于模板的解析,但即使是基于分隔符的解析是有缺陷的,因为类型推断不约而同地应用-见stackoverflow.com/a/50166580/45375
mklement0

0

Foreach对象操作语句:

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

hi
there
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.