迭代在这里的字符串中的子表达式导致额外的空格,为什么?

Chr*_*son 2 powershell

问题

在PowerShell版本5.1.15063.726中运行以下命令

@"
$(foreach ($Number in 1..4) {"$Number`r`n"})
"@
Run Code Online (Sandbox Code Playgroud)

结果是

1
 2
 3
 4
Run Code Online (Sandbox Code Playgroud)

在每行的新行之后似乎添加了尾随空格.

Expirments

我想也许这是一个怪癖

`r`n
Run Code Online (Sandbox Code Playgroud)

但使用[Environment]::NewLine具有相同的问题:

@"
$(foreach ($Number in 1..4) {"$Number" + [Environment]::NewLine})
"@

1
 2
 3
 4
Run Code Online (Sandbox Code Playgroud)

在没有迭代的情况下做一些看似平等的事情按预期工作:

@"
$("1`r`n" + "2`r`n" + "3`r`n" + "4`r`n")
"@
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

以下也有效:

@"
$("1" + [Environment]::NewLine)$("2" + [Environment]::NewLine)$("3" + [Environment]::NewLine)$("4" + [Environment]::NewLine)
"@

@"
$("1`r`n")$("2`r`n")$("3`r`n")$("4`r`n")
"@
Run Code Online (Sandbox Code Playgroud)

以下不起作用,导致新行后的奇数额外空格:

@"
$(1..4 | ForEach-Object {"$_`r`n"})
"@

@"
$(1..4 | ForEach-Object {$("$_`r`n")})
"@
Run Code Online (Sandbox Code Playgroud)

解决方法

想想也许这个问题与在循环中返回多个字符串有关,我试图构建一个字符串,然后返回那个有效的循环形式:

$String = ""
@"
$( foreach ($Number in 1..4) {$String += "$Number`r`n"}; $String)
"@
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

如果我们在从子表达式返回之前聚合字符串但在循环外部进行聚合,则会返回相同的奇怪行为:

$String = ""
@"
$($String += foreach ($Number in 1..4) {"$Number`r`n"}; $String)
"@

1
 2
 3
 4
Run Code Online (Sandbox Code Playgroud)

有人知道是什么导致这种情况发生的吗?

Bil*_*art 5

默认输出字段分隔符是一个空格.您应该能够设置$OFS为空字符串以获得您期望的结果.