Powershell:使用换行符拆分字符串,然后使用-contains

时间:2017-02-13 23:54:30

标签: powershell

$a = {aa
bb
cc}
$a = $a -split "`n"
$a -contains "aa"

当字符串“aa”看似是列表的一部分时,返回false。为什么是这样?

3 个答案:

答案 0 :(得分:4)

补充Kory Gill's helpful answer,这表明问题可能是输入有CRLF("`r`n")行结尾,在这种情况下-split "`n"(拆分)仅限LF)将使结果数组元素留下尾随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是一个正则表达式(正则表达式),它匹配任何可能(\n)LF(?)前面的CR({ {1}})。
正则表达式转义序列\r\r对应于 PowerShell 转义序列\n`r(适用于仅限双引号字符串。

请注意,PowerShell本身在行结尾时非常灵活:

  • 即使在Windows上常规控制台中的 交互式输入也使用仅限LF的行结尾(`n

  • 允许脚本具有CRLF(\n)或LF(\r\n)行结尾,并且 PowerShell 保留源文件的行结尾文件中定义的任何多行字符串文字。

    • 请注意,这甚至适用于多行脚本块,如下所示:当您将此类脚本块转换为字符串之后 - 这只会返回所有内容在脚本块分隔符\n{之间 - 源文件的行结尾反映在结果字符串中。

暂且不说: } 在Windows上包含适合平台的新行(行结束)序列[Environment]::NewLine,{{1在类似Unix的平台上,但是,如上所述,并不能保证遇到的所有输入都有适合平台的新行

答案 1 :(得分:3)

每当我在代码中看到`n时,我总是质疑它是否应该在Windows上运行。

将您的代码更改为:

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

答案 2 :(得分:0)

解决方案跨平台:

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