$a = {aa
bb
cc}
$a = $a -split "`n"
$a -contains "aa"
当字符串“aa”看似是列表的一部分时,返回false。为什么是这样?
答案 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