PowerShell中[IO.File]::WriteAllText拼接Get-Content尾部输出而Set-Content不拼接的原因
二者行为差异的核心原因
Get-Content -tail 10返回的结果是字符串数组,每一个数组元素对应文件的一行,且元素末尾不自带换行符。
[IO.File]::WriteAllText的执行逻辑
WriteAllText是.NET提供的方法,它的第二个输入参数要求为单个字符串:当你传入字符串数组时,PowerShell会默认用空格作为分隔符,把整个数组拼接为单个字符串后再传给方法,因此最终写入的内容就是所有行被空格拼接的长文本。
如果要使用WriteAllText实现分行写入,需要手动把数组用换行符拼接后再传入,示例如下:
$joinedLines = $Lines -join [Environment]::NewLine [IO.File]::WriteAllText("C:\FOOBARRED.txt", $joinedLines)
Set-Content的执行逻辑
Set-Content是PowerShell原生的cmdlet,原生支持接收字符串数组作为输入,它会自动在每一个数组元素的末尾追加系统默认的换行符,再逐行写入文件,因此输出的分行格式符合预期。
相关疑问解答
WriteAllText不是只能处理原始格式数据,它的逻辑非常简单:仅将你传入的单个字符串内容原封不动写入文件,没有额外处理数组、自动追加换行的逻辑,你遇到的问题是参数类型不匹配导致的隐式转换问题。
内容的提问来源于stack exchange,提问作者k1dfr0std
相关产品推荐
相关产品推荐

