Get-Content $user| Foreach-Object{
$user = $_.Split('=')
New-Variable -Name $user[0] -Value $user[1]}
我正在尝试处理脚本并将文本文件拆分为数组,根据每个新行拆分文件
我应该将“=”符号更改为
答案 0 :(得分:27)
这取决于文本文件的确切编码,但[Environment]::NewLine
通常可以解决问题。
"This is `r`na string.".Split([Environment]::NewLine)
输出:
这是
一个字符串。
答案 1 :(得分:5)
String.Split
方法的问题在于它在给定字符串中的每个字符上拆分。因此,如果文本文件具有CRLF行分隔符,则将获得空元素。
更好的解决方案,使用-Split
operator。
"This is `r`na string." -Split "`r`n" #[Environment]::NewLine, if you prefer
答案 2 :(得分:2)
通过使用Split(String[], StringSplitOptions)方法重载,您可以使用String.Split
方法对CRLF
进行拆分,而不会以空元素结尾。
使用此方法有几种不同的方法。
$input.Split([string[]]"`r`n", [StringSplitOptions]::None)
这将拆分由CRLF
表示的组合`r`n
(回车和换行)字符串。 [StringSplitOptions]::None
选项将允许Split
方法返回数组中的空元素,但是如果所有行都以CRLF
结尾,则不应有任何内容。
$input.Split([Environment]::NewLine, [StringSplitOptions]::RemoveEmptyEntries)
这将在 回车符或换行符上分开。因此,该数组将以空元素和实际字符串结尾。 [StringSplitOptions]::RemoveEmptyEntries
选项指示Split
方法不包含空元素。
答案 3 :(得分:1)
到目前为止,给出的答案仅将Windows作为运行环境。如果您的脚本需要在多种环境(Linux,Mac和Windows)中运行,请考虑使用以下代码段:
$lines = $input.Split(
@("`r`n", "`r", "`n"),
[StringSplitOptions]::None)
答案 4 :(得分:-1)
这篇文章还解释了很多关于回车和行尾的工作方式。 https://virot.eu/powershell-and-newlines/
有一些额外的空行问题,因此我找到了理解问题的解决方案。摘自 virot.eu:
<块引用>那么什么构成了一个新行。棘手的部分来了,这取决于。 要理解这一点,我们需要转到字符的换行符。
换行符是 ASCII 字符 10。它在大多数编程语言中 通过写\n 转义,但在powershell 中它是`n。但 Windows 不是 只有一个字符的内容,Windows 也使用回车 这是 ASCII 字符 13。转义 \r。那么区别是什么呢? 换行将指针向下移动一行并回车 再次将其返回到左侧。如果您通过以下方式在 Windows 中存储文件 默认情况下,换行符首先存储为回车,然后 换行符 (\r\n)。当我们不使用任何参数时 split() 命令它将拆分所有空白字符,即 回车、换行、制表符等等。这就是为什么我们 有回车和换行时得到 5 个结果 供稿。