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

Col*_*nic 74 powershell

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

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

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

Col*_*nic 81

在对PowerShell进行了几个月的经验以及一些科学实验之后,这里总结了我所推断的内容.我从来没有在文档中找到任何这些:(

[ 更新:现在大部分内容似乎都有更好的记录.]

读写锁定

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

Set-Content运行时,其他应用程序无法读取日志文件.因此,永远不要使用Set-Content记录长时间运行的命

编码

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

编者注:PowerShell从版本5.1开始仍然默认使用特定于文化Default("ANSI")的编码,尽管文档声称.如果ASCII是默认值,则非ASCII字符(例如ü将转换为文字) ?,但情况并非如此:'ü' | 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
Run Code Online (Sandbox Code Playgroud)

这意味着两个命令的默认值不兼容,混合它们将损坏文本,因此始终指定编码.

格式化

正如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
Run Code Online (Sandbox Code Playgroud)

我相信这种格式化会导致换行,但我还不能描述它.

文件创建

Set-Content会在以下情况下无法可靠地创建空文件Out-File:

在空文件夹中,该命令dir | out-file out.txt创建文件,而不创建文件dir | set-content sc.txt.

管道变量

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

Out-File从管道获取数据; 更新单个文件的内容.

参数

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

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

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

  • 附加
  • noclobber选项
  • 宽度

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

  • `Set-Content`默认编码:翻译成`(Get-Culture).Textinfo.ANSICodePage`(Windows 8.1,Powershell 4.0,CurrentCulture`cs-CZ`,CurrentUICulture`en-GB`,ANSICodePage`1250`,OEMCodePage`852 `,在上面的代码页中使用`'žž'字符串和不同的代码进行测试. (4认同)

And*_*ndi 15

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

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

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


Bar*_*ekB 7

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

  1. Out-File有-Append(-NoClober可以避免覆盖),这将是Add-Content.但这不是同一个野兽.
  2. 命令| Add-Content将在输入时使用.ToString()方法.Out-File将使用默认格式.

所以:

ls | Add-Content test.txt
Run Code Online (Sandbox Code Playgroud)

ls | Out-File test.txt
Run Code Online (Sandbox Code Playgroud)

会给你完全不同的结果.

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

HTH Bartek

  • 它是一个别名,意思是`>`和Out-File是同一个东西.他们调用相同的代码.来自Bruce Payette的PowerShell in Action第二版(Kindle Locations 4646):"实际上,myScript> file.txt只是myScript的"语法糖".out-file -path file.txt在某些情况下,您需要直接使用Out-File,因为它可以让您更好地控制输出的写入方式. (2认同)
  • 是的,我认为这是一个重要的区别,```不是'out-file`的完全等价物.如果设置`$ PSDefaultParameterValues ["Out-File:Encoding"] ="UTF8"`,它将被`>`忽略. (2认同)