Powershell的设置内容和out-file有什么区别?

在PowerShell中, out-fileset-content什么区别? 编辑:或者add-contentout-file -append

我发现如果我同时使用这两个文件,那么这个文本就是一团糟。

(第二个问题, >out-file的别名,对吧?)

下面是我在Powershell几个月的经验和一些科学实验之后得出的结论。 从来没有发现任何在文件中的:(

[ 更新:大部分现在似乎都被更好的logging。]

读取和写入locking

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

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

编码

Out-File默认保存为UnicodeUTF-16LE )编码(虽然可以指定),而Set-Content在PowerShell 3+(也可以指定)中默认为ASCIIUS-ASCII )。 在较早的PowerShells中, Set-Content使用Default (ANSI)编码编写内容。

编者按 :PowerShell从版本5.1 仍然默认为文化特定的Default (“ANSI”)编码,尽pipe文档声明。 如果ASCII是默认的,那么非ASCII字符如ü会被转换为文字 ? ,但情况并非如此: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?' 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?' 产生$False

 PS > $null | out-file outed.txt PS > $null | set-content set.txt PS > md5sum * f3b25701fe362ec84616a93a45ce9998 *outed.txt d41d8cd98f00b204e9800998ecf8427e *set.txt 

这意味着两个命令的默认值是不兼容的,混合它们会损坏文本,所以总是指定一个编码。

格式化

正如Bartek所解释的那样, Out-File保存输出的花哨格式,如terminal所示。 所以在一个有两个文件的文件夹中,命令是dir | out-file out.txt dir | out-file out.txt用11行创build一个文件。

Set-Content保存了一个更简单的表示。 在该文件夹中有两个文件,命令dir | set-content sc.txt dir | set-content sc.txt用两行创build一个文件。 要在terminal中模拟输出:

 PS > dir | ForEach-Object {$_.ToString()} out.txt sc.txt 

我相信这种格式化对于换行符有一个结果,但我还不能描述它。

文件创build

Out-File操作时, Set-Content不会可靠地创build一个空文件:

在一个空文件夹中,使用命令dir | out-file out.txt dir | out-file out.txt创build一个文件,而dir | set-content sc.txt dir | set-content sc.txt不。

pipe道variables

Set-Content从pipe道获取文件名; 允许您将一些文件的内容设置为某个固定值。

Out-File从pipe道中取数据; 更新单个文件的内容。

参数

Set-Content包含以下附加参数:

  • 排除
  • 过滤
  • 包括
  • 的PASSThru
  • stream
  • 的UseTransaction

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

  • 附加
  • noclobber选项
  • 宽度

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

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

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

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

那么,我会不同意… 🙂

  1. Out-File具有-Append(-NoClober是为了避免覆盖),将添加内容。 但是这不是同一个野兽。
  2. 命令| 添加内容将使用.ToString()方法input。 Out-File将使用默认的格式。

所以:

 ls | Add-Content test.txt 

 ls | Out-File test.txt 

会给你完全不同的结果。

不,'>'不是别名,它是redirect操作符(和其他shell一样)。 并且有非常严重的限制…它将以与它们显示的方式相同的方式切割线条。 Out-File有-Width参数可以帮助您避免这种情况。 另外,使用redirect操作符,您无法决定使用哪种编码。

HTH Bartek

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

所以当你想把二进制数据或者Text.Encoding#GetBytes()结果写入一个文件时,你应该使用Set-Content