96

Out-File在 PowerShell 中,和有什么区别Set-Content?或者Add-ContentOut-File -append

我发现如果我对同一个文件使用两者,则文本完全是mojibaked

(第二个小问题:>是 的别名Out-File,对吗?)

4

6 回答 6

103

这是我在使用 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

于 2012-11-24T18:10:54.630 回答
19

Out-File-NoClobber除非设置了和/或-Append标志,否则具有覆盖输出路径的行为。Add-Content如果默认情况下输出路径已经存在(如果可以),将附加内容。如果一个文件尚不存在,两者都将创建该文件。

另一个有趣的区别是Add-Content默认情况下会创建一个 ASCII 编码文件,默认情况下Out-File会创建一个小端 unicode 编码文件。

>是.的别名语法糖Out-File。它Out-File带有一些预定义的参数设置。

于 2012-05-18T16:04:02.023 回答
10

好吧,我不同意... :)

  1. Out-File 有 -Append (-NoClober 是为了避免覆盖),它将添加内容。但这不是同一只野兽。
  2. 命令 | Add-Content 将在输入上使用 .ToString() 方法。Out-File 将使用默认格式。

所以:

ls | Add-Content test.txt

ls | Out-File test.txt

会给你完全不同的结果。

不,'>' 不是别名,它是重定向运算符(与其他 shell 相同)。并且有非常严重的限制......它会以相同的方式切割线条。Out-File 具有 -Width 参数,可帮助您避免这种情况。此外,使用重定向运算符,您无法决定使用什么编码。

HTH 巴特克

于 2012-05-18T18:43:48.650 回答
3

Set-Content支持-Encoding Byte,而不支持Out-File

因此,当您想将二进制数据或结果写入Text.Encoding#GetBytes()文件时,您应该使用Set-Content.

于 2017-05-30T15:17:17.943 回答
0

Out-file -append 或“>>”实际上可以在同一个文件中混合两种编码。即使文件最初是ascii或ansi,它也会默认添加unicode到它的底部。添加内容将在附加之前检查编码并匹配它。顺便说一句,export-csv 默认为 ascii(无重音符号),并将 set-content/add-content 设置为 ansi。

于 2019-05-11T00:41:52.943 回答
0

想补充一下编码的区别:

带有 PowerShell 5.1 的 Windows:

  • Out-File - 默认编码为 utf-16le
  • Set-Content - 默认编码是 us-ascii

带有 PowerShell 7.1 的 Linux:

  • Out-File - 默认编码是 us-ascii
  • Set-Content - 默认编码是 us-ascii
于 2020-12-20T11:14:54.203 回答