Out-File
在 PowerShell 中,和有什么区别Set-Content
?或者Add-Content
和Out-File -append
?
我发现如果我对同一个文件使用两者,则文本完全是mojibaked。
(第二个小问题:>
是 的别名Out-File
,对吗?)
Out-File
在 PowerShell 中,和有什么区别Set-Content
?或者Add-Content
和Out-File -append
?
我发现如果我对同一个文件使用两者,则文本完全是mojibaked。
(第二个小问题:>
是 的别名Out-File
,对吗?)
这是我在使用 PowerShell 几个月的经验和一些科学实验后得出的结论的摘要。我从未在文档中找到任何这些:(
[更新:现在大部分内容似乎都有更好的记录。]
在Out-File
运行时,另一个应用程序可以读取日志文件。
在Set-Content
运行时,其他应用程序无法读取日志文件。因此永远不要Set-Content
用来记录长时间运行的命令。
Out-File
默认保存为Unicode
( UTF-16LE
) 编码(尽管可以指定),而在 PowerShell 3+ 中Set-Content
默认为ASCII
( US-ASCII
) (也可以指定)。在早期的 PowerShell 版本中,以(ANSI) 编码Set-Content
写入内容。Default
编者注:从 5.1 版开始,PowerShell仍默认为特定于文化的Default
(“ANSI”)编码,尽管文档声称如此。如果 ASCII 是默认值,则非 ASCII 字符(例如,ü
将转换为literal ?
),但情况并非如此:'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
yield $False
。
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
这意味着两个命令的默认值是不兼容的,混合它们会破坏文本,所以总是指定一个编码。
正如 Bartek 解释的那样,Out-File
保存输出的精美格式,如终端所示。因此,在一个包含两个文件的文件夹中,该命令dir | out-file out.txt
会创建一个包含 11 行的文件。
而Set-Content
节省了更简单的表示。在包含两个文件的那个文件夹中,该命令dir | set-content sc.txt
创建一个包含两行的文件。要模拟终端中的输出:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
我相信这种格式会导致换行符,但我还不能描述它。
Set-Content
不会在以下情况下可靠地创建空文件Out-File
:
在一个空文件夹中,该命令dir | out-file out.txt
会创建一个文件,而dir | set-content sc.txt
不会。
Set-Content
从管道中获取文件名;允许您将多个文件的内容设置为某个固定值。
Out-File
从管道中获取数据;更新单个文件的内容。
Set-Content
包括以下附加参数:
Out-File
包括以下附加参数:
有关这些参数是什么的更多信息,请参阅帮助;例如get-help out-file -parameter append
。
Out-File
-NoClobber
除非设置了和/或-Append
标志,否则具有覆盖输出路径的行为。Add-Content
如果默认情况下输出路径已经存在(如果可以),将附加内容。如果一个文件尚不存在,两者都将创建该文件。
另一个有趣的区别是Add-Content
默认情况下会创建一个 ASCII 编码文件,默认情况下Out-File
会创建一个小端 unicode 编码文件。
>
是.的别名语法糖Out-File
。它Out-File
带有一些预定义的参数设置。
好吧,我不同意... :)
所以:
ls | Add-Content test.txt
和
ls | Out-File test.txt
会给你完全不同的结果。
不,'>' 不是别名,它是重定向运算符(与其他 shell 相同)。并且有非常严重的限制......它会以相同的方式切割线条。Out-File 具有 -Width 参数,可帮助您避免这种情况。此外,使用重定向运算符,您无法决定使用什么编码。
HTH 巴特克
Set-Content
支持-Encoding Byte
,而不支持Out-File
。
因此,当您想将二进制数据或结果写入Text.Encoding#GetBytes()
文件时,您应该使用Set-Content
.
Out-file -append 或“>>”实际上可以在同一个文件中混合两种编码。即使文件最初是ascii或ansi,它也会默认添加unicode到它的底部。添加内容将在附加之前检查编码并匹配它。顺便说一句,export-csv 默认为 ascii(无重音符号),并将 set-content/add-content 设置为 ansi。
想补充一下编码的区别:
带有 PowerShell 5.1 的 Windows:
带有 PowerShell 7.1 的 Linux: