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


86

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

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

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

Answers:


94

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

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

读写锁定

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

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

编码方式

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

编者注:尽管文档声称,PowerShell自5.1版起默认使用特定于区域性的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


4
Set-Content默认编码:转换为(Get-Culture).Textinfo.ANSICodePage(Windows 8.1,Powershell 4.0,CurrentCulture cs-CZ,CurrentUICulture en-GB,ANSICodePage 1250,OEMCodePage 852,使用'řž'上述代码页中具有不同代码的字符串进行了测试)。
JosefZ

另请注意,Out-File在某些情况下长线会出现问题。例如: $x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
培根片,

17

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

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

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


谢谢,了解编码差异很有用。您不太正确,如果执行echo "" > $null | Add-Content abc.txt操作不会创建file abc.txt,而Out-File会创建。
Panic Panic

@MattHickford这有点奇怪。该代码通过管道传递给$ null,因此Add-Content不会收到任何东西。如果Add-Content什么都没收到,为什么要创建文件?另一方面,可以对文件外存储提出相同的问题。
安迪·阿里斯曼迪

差异对我来说很重要,gci $folder | Out-File log.txt ; cat log.txt而作品却会gci $folder | Add-Content log.txt ; cat log.txt炸毁
Panic Panic

@MattHickford在尝试处理该文件之前,我可能会确保该文件存在。可能是所有语言的好习惯。
安迪·阿里斯曼迪

另一个区别是,在Set-Content使用该文件时,其他应用程序将无法使用该文件。
上校恐慌

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 Bartek


3
别名>与Out-File是同一件事。他们调用相同的代码。摘自Bruce Payette的PowerShell in Action第二版(Kindle位置4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
Andy Arismendi 2012年

1
关于默认格式(文件外)与ToString(添加内容)的要点
Andy Arismendi,2012年

我的观点是:尽管两者通常都相同,但是别名在PowerShell中具有它的含义...因此,我也不会使用该术语来描述两者之间的关系。 :ls | >可能是file.txt。显然,这是行不通的……
BartekB 2012年

1
默认格式是给定对象在控制台中的显示方式。大多数核心cmdlet /对象类型都具有格式化元数据,该元数据可告知PowerShell如何以用户友好的方式显示它们。换句话说:命令输出到Out-File的管道结果可用于将命令输出保存到文件,而不会丢失PowerShell所做的格式化。
2014年

2
是的,我认为这是一个重要的区别,>并不完全等同于out-file。如果设置$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8",它将被忽略>
Wisbucky

3

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

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.