$a = {aa
bb
cc}
$a = $a -split "`n"
$a -contains "aa"
Это возвращает false, когда строка «aa», по-видимому, входит в список. Почему это?Powershell: split string с символом новой строки, затем используйте -contains
$a = {aa
bb
cc}
$a = $a -split "`n"
$a -contains "aa"
Это возвращает false, когда строка «aa», по-видимому, входит в список. Почему это?Powershell: split string с символом новой строки, затем используйте -contains
В дополнение к 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-подобных платформах, но, как описано выше , нет никакой гарантии, что все встреченные входные данные будут иметь подходящие для платформы новые строки.
Каждый раз, когда я вижу код `n в коде, я всегда сомневаюсь, должно ли оно быть` r`n в Windows.
Изменить код для этого:
$a = $a -split "`r`n"
Или разделите на символ _any_ whitespace: '$ a -split '[\ s] +" ' – xXhRQ8sD2L7Z
@ ST8Z6FR57ABE6A8RE9UF:' '\ s +'' будет делать, но обратите внимание, что намерение OP состоит в том, чтобы разделить на _lines_, а не на какой-либо прогон пробелов. – mklement0
крест решение Платформа:
$a = $a -split [System.Environment]::NewLine
Хотя знание о '[Environment] :: NewLine' полезно, использование его с помощью' -split' не является истинным кросс-платформенным решением, потому что вам нужно быть готовым к тому, чтобы обрабатывать какой-либо тип окончания строки, учитывая, что это не гарантированно, что вы столкнетесь только с родственными платформой. Например, если вы определяете многострочную строку в обычной консоли PowerShell _ в Windows_, она будет иметь окончания строки _LF-only_, а '-split [Environment] :: NewLine' не найдет строк и вернет всю строку ввода как одноэлементный массив. – mklement0
Даже если ваш вопрос кажется очевидным, это будет помочь вам сделать изменить его таким образом, чтобы доработать; чего вы пытаетесь достичь и т. д. – nyedidikeke
Почему вы раскалываете скриптовый блок? (И подсказка: вы программист в интерактивной оболочке. PowerShell не лжет, когда он возвращает false, что означает, что 'aa' не является частью списка, а это значит, что вы должны быть в курсе того, что содержит список.' ($ a -split "\' n ") [0] .Length' =>' 3' например) – TessellatingHeckler
-Содержание - это оператор списка (список содержит элемент). Вы хотите, например, -match или .Contains() (строковый метод), чтобы делать то, что вы ищете. –