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: