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

Geo*_*uer 11 powershell

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

line 1
line 2
Run Code Online (Sandbox Code Playgroud)

我创建了以下功能

PS>function wrapit($text) {
@"
---Start---
$text
---End---
"@
}
Run Code Online (Sandbox Code Playgroud)

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

将输出

---Start---
line 1 line 2
---End---
Run Code Online (Sandbox Code Playgroud)

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

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

JPB*_*anc 11

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

wrapit((Get-Content c:\temp\temp.txt | out-string))
Run Code Online (Sandbox Code Playgroud)

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

$a = Get-Content c:\temp\temp.txt
"$a"
Run Code Online (Sandbox Code Playgroud)

关于你的评论:

$a | Get-Member
TypeName: System.String
...
Run Code Online (Sandbox Code Playgroud)

Get-Member -InputObject $a
TypeName: System.Object[]
...
Run Code Online (Sandbox Code Playgroud)

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


Geo*_*uer 7

的儿子...

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

真正令人费解的是为什么结果被强制get-member转换为字符串.有人知道为什么会这样吗?在我明确检查之前,问题并不明显Get-Type

在任何情况下,解决方案是使用[system.io.file]::ReadAllText('c:\temp\temp.txt')over 读取文件Get-Content

  • `Get-Content -raw` 似乎也能达到目的。它需要 PS >= 3。 (2认同)