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