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

标签 powershell

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

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

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

最佳答案

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

[更新:现在看来其中大部分内容都有更好的记录。]

读写锁定

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

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

编码

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

编者注:从版本 5.1 开始,PowerShell 仍然默认使用特定于区域性的默认(“ANSI”)编码,尽管文件声称如此。如果 ASCII 为默认值,则非 ASCII 字符(例如 ü)将被转换为文字 ?,但事实并非如此 em> 案例:'ü' |设置内容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 保存输出的精美格式,如终端中所示。因此,在包含两个文件的文件夹中,命令 dir | out-file out.txt 创建一个包含 11 行的文件。

Set-Content保存了更简单的表示。在包含两个文件的文件夹中,命令 dir | set-content sc.txt 创建一个包含两行的文件。要模拟终端中的输出:

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

我相信这种格式会导致换行,但我还无法描述它。

文件创建

Set-ContentOut-File 执行以下操作时无法可靠地创建空文件:

在空文件夹中,命令dir | out-file out.txt 创建一个文件,而 dir | set-content sc.txt 没有。

管道变量

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

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

参数

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

  • 排除
  • 过滤
  • 包括
  • 通过
  • 直播
  • 使用交易

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

  • 追加
  • 无破坏
  • 宽度

有关这些参数的更多信息,请参阅帮助;例如获取帮助输出文件-参数附加

关于PowerShell Set-Content 和 Out-File - 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10655788/

相关文章:

c# - 如何在 c++/cli 中使用 Runspace.StateChanged 事件?

Xml 命名空间和 C# csproj

powershell - 为什么这个 do/until 循环以 1 开始的值退出?

c# - 在给定 IP 范围内的机器上远程执行 Powershell 脚本

powershell - PowerShell 是否不为非默认端口发送身份验证 header ?

azure - 使用 az powershell 创建 azure AD 应用程序

powershell - <位置> : Missing ')' in method call. - Powershell

powershell - 带有 utf-8 编码的 tee

powershell - (Powershell) 捕获 "Get-WinEvent : No events were found"Get-WinEvent

powershell - 尝试仅在终止异常时起作用吗?