-Join и -Split

Одно из преимуществ PowerShell 2.0 это новые операторы, в частности -Join и -Split служащие для работы с текстом. -Join объеденяет несколько строк в одну, вставляя указанный разделитель. Ну а -Split соответственно наоборот разделяет строку на составные части.

Вот несколько примеров.

Объеденяем несколько кусков текста в одну строку, используя в качестве соединения пробелы:

[PS <1> C:\Root] "Power", "Shell", "V2.0" -Join " "
Power Shell V2.0

Получаем несколько строк из текстового файла и объединяем в одну строку через точку с запятой и пробел:

[PS <2> C:\Root] Get-Content c:\temp\computers.txt
PC1
PC2
Server1
[PS <3> C:\Root] (Get-Content c:\temp\computers.txt) -Join "; "
PC1; PC2; Server1

Разделяем строку из лога на компоненты:

[PS <4> C:\Root] "00:04:18 192.168.254.116 anonymous [1]USER anonymous 331 0 0 0 0 - -" -Split " "
00:04:18
192.168.254.116
anonymous
[1]USER
anonymous
331
0
0
0
0
-
-

Можно поместить результат в массив, и обращаться к элементам по индексу:

[PS <5> C:\Root] $Tokens = "00:04:18 192.168.254.116 anonymous [1]USER anonymous 331 0 0 0 0 - -" -Split " "
[PS <6> C:\Root] $Tokens[2]
anonymous
[PS <7> C:\Root] $Tokens[2,3]
anonymous
[1]USER
[PS <8> C:\Root] $Tokens[0..3]
00:04:18
192.168.254.116
anonymous
[1]USER

Если указать только второй операнд, он будет разделён по пробелам:

[PS <9> C:\Root] -Split "One Two Three"
One
Two
Three

Кроме разделителя можно указать максимальное количество элементов в результате:

[PS <10> C:\Root] "Gusev:Vasily:1:63:12" -split ":",3
Gusev
Vasily
1:63:12

Или использовать специальные аргументы, типа RegexMatch для применения регулярных выражений:

[PS <11> C:\Root] 'abc1def23xyz4mn5' -split '[^\d]\d.', 0, "RegexMatch"
ab
e
xy
n5

Или даже скриптблоки, что позволяет реализовать вообще любые условия разделения (текущий обрабатываемый символ представляется как переменная $_):

[PS <12> C:\Root] "a1b2c3d4e5f6g7h8i9j" -split {$_ -match "\d" -and -not ([int]$_ % 3)}
a1b2c
d4e5f
g7h8i
j

Это всё будет доступно в версии 2.0, но что делать если не хочется ждать? В PS 1.0 можно попробовать обойтись средствами .Net напрямую. Это будет конечно менее удобно, и не совсем «the powershell way», но тоже неплохо😉

[PS <13> C:\Root] [string]::Join("-",$arr)
abc-def-zxc
[PS <14> C:\Root] "1;2;3".split(";")
1
2
3

Один ответ to “-Join и -Split”

  1. loki Says:

    Здраствуйте, извиняюсь, у меня вопрос не по теме, просто в последнем посте его оставляю…. как в intertet explorer работать с со страницей не зная ID элементов и как HTML документе открывать ссылки по одной, каждую в новой вкладке?


Обсуждение закрыто.

%d такие блоггеры, как: