2017-02-13 3 views
4
$a = {aa 
bb 
cc} 
$a = $a -split "`n" 
$a -contains "aa" 

Это возвращает false, когда строка «aa», по-видимому, входит в список. Почему это?Powershell: split string с символом новой строки, затем используйте -contains

+0

Даже если ваш вопрос кажется очевидным, это будет помочь вам сделать изменить его таким образом, чтобы доработать; чего вы пытаетесь достичь и т. д. – nyedidikeke

+3

Почему вы раскалываете скриптовый блок? (И подсказка: вы программист в интерактивной оболочке. PowerShell не лжет, когда он возвращает false, что означает, что 'aa' не является частью списка, а это значит, что вы должны быть в курсе того, что содержит список.' ($ a -split "\' n ") [0] .Length' =>' 3' например) – TessellatingHeckler

+0

-Содержание - это оператор списка (список содержит элемент). Вы хотите, например, -match или .Contains() (строковый метод), чтобы делать то, что вы ищете. –

ответ

3

В дополнение к Kory Gill's helpful answer, что свидетельствует о том, что проблема может быть, что вход имеет CRLF ("`r`n") окончаний строк, в этом случае -split "`n" (расщепление Л.Ф. только) оставит результирующие элементы массива с завершающим CR ("`r"), в результате чего "aa" не будет найдено с -contains, так как фактическое значение равно "aa`r".

общего способ обработки ввода с Windows- или окончаниями линии Unix-стилем является использование:

$a -split '\r?\n' # split $a into lines, whether it has CRLF or LF-only line endings 

\r?\n является регулярного выражения (регулярного выражения), что соответствует любому LF (\n) возможно (?), которому предшествует CR (\r).
Regex экранирующие последовательности \r и \n соответствуют PowerShell экранирующие последовательности `r и `n (которые работают в двойных кавычках строки только).

Обратите внимание, что сам по себе PowerShell является достаточно гибким, когда речь идет о линии окончаний:

  • Даже на Windows, интерактивного входа в обычной консоли использует LF-только окончания строк (\n).

  • Сценарии могут иметь CRLF (\r\n) или LF (\n) строки окончаний и PowerShell сохраняет окончаний строк исходного файла в любых строковых литералов многострочных, определенных в файле.

    • Обратите внимание, что это относится даже к многострочно сценарию блоков, как и в вопросе: при преобразовании такого блока сценария в строку позже - который просто возвращает всю между скрипт-блок разделители , { и } - окончание строк исходного файла отражается в полученной строке.

Как и в сторону: [Environment]::NewLine содержит последовательность платформы необходимости перевода строки (строка окончание): "`r`n" на Windows, "`n" на Unix-подобных платформах, но, как описано выше , нет никакой гарантии, что все встреченные входные данные будут иметь подходящие для платформы новые строки.

2

Каждый раз, когда я вижу код `n в коде, я всегда сомневаюсь, должно ли оно быть` r`n в Windows.

Изменить код для этого:

$a = $a -split "`r`n" 
+0

Или разделите на символ _any_ whitespace: '$ a -split '[\ s] +" ' – xXhRQ8sD2L7Z

+0

@ ST8Z6FR57ABE6A8RE9UF:' '\ s +'' будет делать, но обратите внимание, что намерение OP состоит в том, чтобы разделить на _lines_, а не на какой-либо прогон пробелов. – mklement0

0

крест решение Платформа:

$a = $a -split [System.Environment]::NewLine 
+0

Хотя знание о '[Environment] :: NewLine' полезно, использование его с помощью' -split' не является истинным кросс-платформенным решением, потому что вам нужно быть готовым к тому, чтобы обрабатывать какой-либо тип окончания строки, учитывая, что это не гарантированно, что вы столкнетесь только с родственными платформой. Например, если вы определяете многострочную строку в обычной консоли PowerShell _ в Windows_, она будет иметь окончания строки _LF-only_, а '-split [Environment] :: NewLine' не найдет строк и вернет всю строку ввода как одноэлементный массив. – mklement0

Смежные вопросы