在PowerShell中连接或使用heredoc时保留换行符

时间:2012-11-13 04:18:25

标签: powershell

假设我的文档c:\temp\temp.txt包含内容

line 1
line 2

我创建了以下函数

PS>function wrapit($text) {
@"
---Start---
$text
---End---
"@
}

然后运行PS> wrapit((Get-Content c:\temp\temp.txt))

将输出

---Start---
line 1 line 2
---End---

如何保留换行符?追加与插值无关。

I found this related question,但这里他们使用的是字符串数组。我正在使用一个单行字符串,其中包含换行符(如果直接从函数内部输出字符串而不连接,则可以看到它们,$text | gm确认我正在处理字符串,而不是数组)。我可以在世界上进行所有的字符串解析,将其锤入到位,但这似乎就像是在圆孔中敲击一个方形钉。我缺少的概念是什么?

2 个答案:

答案 0 :(得分:11)

做你想做的事的一个简单方法是:

wrapit((Get-Content c:\temp\temp.txt | out-string))

现在解释:Here-strings @“”只是表现得像字符串“”,结果是由于变量扩展中的PowerShell行为。试试吧:

$a = Get-Content c:\temp\temp.txt
"$a"

关于你的评论:

$a | Get-Member
TypeName: System.String
...

但是

Get-Member -InputObject $a
TypeName: System.Object[]
...

第一个答案是OK(它接收字符串)。它每次都不会重复System.string。在第二个接收数组作为参数。

答案 1 :(得分:7)

儿子...

经过调查,似乎Get-Content返回一个字符串数组。默认情况下,通过连接默认字符' ',这当然是强制转换为字符串。

真正令人费解的是为什么结果被get-member强制转换为字符串。 任何人都知道为什么会发生这种情况?在明确核实Get-Type

之前,这个问题并不明显

无论如何,解决方案是使用[system.io.file]::ReadAllText('c:\temp\temp.txt') Get-Content

来阅读文件