多行字符串中的foreach管道

时间:2018-08-16 04:05:40

标签: powershell foreach format

这是我的代码:

$collection1 = "1","2","3","4"
"
collection1:
$($collection1 | % {$_})
"

输出为:

collection1:

1 2 3 4

但是,我期望:

collection1:
1
2
3
4

所以我将代码更改为:

"
$($collection1 | % {$_ + "`n"})
"

现在,它显示:

collection1:
1
 2
 3
 4

为什么每行的前面总是有多余的空间?

有什么方法可以删除它们?

我尝试使用Trim()[String]::Format()和其他几种方式,但都没有按预期工作。

2 个答案:

答案 0 :(得分:0)

我想我找到了答案...为了任何人的利益...

$collection1 = "1","2","3","4"

$body = [System.Text.StringBuilder]::new()

foreach($item in $collection1)
{
    [void]$body.Append($item+"`n")
}

"
collection1:
$body
"

答案 1 :(得分:0)

$collection1 | % {$_}接受数组$collection1并输出其每个元素,这为您提供了与之完全相同的东西:$collection1元素的数组。使用子表达式将该数组放入字符串会自动将该数组转换为字符串,以便可以将其插入外部字符串。在PowerShell中,此数组到字符串的转换是通过将数组元素与$OFS字符(输出字段分隔符,默认为单个空格)相连而完成的,在您的示例中,该字符串产生字符串“ 1 2 3 4”。

获得期望结果的最简单方法是自己将数组转换为格式化的字符串:

"
collection1:
$($collection1 | Out-String)
"

Out-String cmdlet通过将所有输入字符串与换行符连接在一起,将数组输入转换为单个字符串。或者,您也可以自己加入数组:

"
collection1:
$($collection1 -join "`n")
"

您还可以(临时)修改$OFS并直接使用该变量:

$OFS_bak = $OFS
$OFS = "`n"
"
collection1:
$collection1
"
$OFS = $OFS_bak

尽管我通常不建议这样做。


作为旁注:使用格式/模板字符串时,通常最好使用here-strings(这样就不需要在字符串中使用escpae引号)和format operator-f):

@"
collection1:
{0}
"@ -f ($collection1 | Out-String)