为了账号安全,请及时绑定邮箱和手机立即绑定

PowerShell Set-Content和Out-File-有什么区别?

/ 猿问

PowerShell Set-Content和Out-File-有什么区别?

慕运维8079593 2019-12-26 09:13:11

在PowerShell中,Out-File和之间有什么区别Set-Content?还是Add-Content和Out-File -append?


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


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


查看完整描述

3 回答

?
烧仙草VB

这是经过几个月的PowerShell经验和一些科学实验后得出的结论的摘要。我从未在文档中找到任何这些:(


[ 更新:现在看来很多这样的文档都有很好的记录。]


读写锁定

在Out-File运行时,另一个应用程序可以读取日志文件。


在Set-Content运行时,其他应用程序无法读取日志文件。因此,切勿使用Set-Content日志记录长时间运行的命令。


编码方式

Out-File默认情况下以Unicode(UTF-16LE)编码保存(尽管可以指定),而在PowerShell 3+中Set-Content默认为ASCII(US-ASCII)(也可以指定)。在早期的PowerShell版本中,Set-Content以Default(ANSI)编码编写内容。


编者注:尽管文档声称,但从5.1版开始,PowerShell 仍默认使用区域性特定的Default(“ ANSI”)编码。如果默认为ASCII,则非ASCII字符(例如)ü将转换为文字 ?,但事实并非如此:'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'yields $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 包括以下附加参数:


排除

过滤

包括

直通

UseTransaction

Out-File 包括以下附加参数:


附加

NoClobber

宽度

有关这些参数的更多信息,请参考帮助。例如get-help out-file -parameter append。


查看完整回答
反对 回复 2019-12-26
?
SMILET

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

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

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


查看完整回答
反对 回复 2019-12-26
?
慕侠2389804

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


Out-File具有将添加内容的-Append(-NoClober以避免覆盖)。但这不是同一只野兽。

命令 Add-Content将在输入上使用.ToString()方法。Out-File将使用默认格式。

所以:


ls | Add-Content test.txt


ls | Out-File test.txt

会给您完全不同的结果。


不,'>'不是别名,它是重定向运算符(与其他shell相同)。并且有非常严重的局限性...它将以相同的方式显示线条。Out-File具有-Width参数,可帮助您避免这种情况。同样,使用重定向运算符,您无法决定要使用哪种编码。


HTH Bartek


查看完整回答
反对 回复 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信