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

时间:2012-05-18 15:48:32

标签: powershell

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

我发现如果我同时使用同一个文件,则文字完全mojibaked

(小问题:>Out-File的别名,对吗?)

6 个答案:

答案 0 :(得分:79)

以下是我在使用PowerShell几个月的经验和一些科学实验后总结了我所推断的内容。我从未在文档中找到任何相关内容:(

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

读写锁定

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

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

编码

Out-File默认保存在UnicodeUTF-16LE)编码中(尽管可以指定),而Set-Content默认为ASCII({{ 1}})在PowerShell 3+中(也可以指定)。在早期的PowerShell版本中,US-ASCIIDefault(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从管道中获取文件名;允许你设置一些文件&#39;内容到某个固定值。

dir | set-content sc.txt从管道获取数据;更新单个文件的内容。

参数

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

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

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

  • 追加
  • 了noclobber
  • 宽度

有关这些参数的更多信息,请参阅帮助;例如Set-Content

答案 1 :(得分:15)

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

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

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

答案 2 :(得分:7)

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

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

    ls | Add-Content test.txt
    

    ls | Out-File test.txt
    

    会给你完全不同的结果。

    不,'&gt;'不是别名,它是重定向运算符(与其他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:

  • 输出文件 - 默认编码为 utf-16le
  • Set-Content - 默认编码为 us-ascii

带有 PowerShell 7.1 的 Linux:

  • Out-File - 默认编码为 us-ascii
  • Set-Content - 默认编码为 us-ascii