Разделение строки на отдельные переменные

82

У меня есть строка, которую я разделил с помощью кода $CreateDT.Split(" "). Теперь я хочу по-разному управлять двумя отдельными строками. Как я могу разделить их на две переменные?

Davetherave
источник
См. Аналогичный stackoverflow.com/questions/11348506/…
Майкл

Ответы:

140

Как это?

$string = 'FirstPart SecondPart'
$a,$b = $string.split(' ')
$a
$b
мьолинор
источник
7
Если у вас есть "FirstPart SecondPart ThirdPart"и вы хотите только двоих, можете использовать$a,$b = $string.split(' ')[0,1]
Стойнов
Если у вас есть $ string = 'FirstPart - SecondPart' и $ a, $ b = $ string.split ('-'), добавьте ..Trim () ($ a, $ b = $ string.split ('-') .Trim ()), то и $ a, и $ b обрезаются
mortenma71 02
52

Массив создается -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
vonPryz
источник
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
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 оператор :

  • выполняет сравнение без учета регистра
  • разбивается только на всю строку
0xG
источник
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
Эсперенто57
источник
ConvertFrom-String - лучшее решение. Следует отметить, что ConvertFrom-String на самом деле разработан с особым намерением разделять и объективировать строки информации, а это именно то, чего хочет OP. Следует также отметить, что, хотя командлет разделения работает, для получения желаемого OP требуется дополнительная манипуляция, о чем позаботится ConvertFrom-String.
данно 02
1
@danstermeister: Как правило, использование командлета для простого разделения строк неэффективно. В частности, 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 в будущем. И вопросы эффективности командлетов лучше доверить разработчикам, а не создателям сценариев.
данно
@danstermeister: Правда, при отсутствии дополнительной информации вы не можете сделать вывод, что он не будет перенесен из текущего отсутствия - только то, что это не было приоритетом . Это спорный вопрос, однако, поскольку все ConvertFrom-String«S врожденных проблем являются достаточной причиной , чтобы избежать этого. Это особенно относится к шаблону на основе синтаксического анализа, но даже разделителем на основе синтаксического анализа ошибочна, из - за типа вывода , который неизменно применяется - см stackoverflow.com/a/50166580/45375 .
mklement0
0

Оператор операции с каждым объектом:

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

hi
there
js2010
источник