11

假设我有一个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---

如何保留换行符?追加与插值没有帮助。

我发现了这个相关的问题,但这里他们使用的是字符串数组。我正在使用其中包含换行符的单个字符串(如果您直接从函数内部输出字符串而不连接并$text | gm确认我正在使用字符串,而不是数组,则可以看到它们)。我可以做世界上所有的字符串解析来把它敲到位,但这似乎我会把一个方形的钉子敲进一个圆孔。我缺少什么概念?

4

2 回答 2

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[]
...

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

于 2012-11-13T04:37:35.360 回答
7

的儿子...

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

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

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

于 2012-11-13T04:33:39.380 回答