在PowerShell中,Out-File和之间的区别是Set-Content什么?还是Add-Content和Out-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-Content以Default(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 包括以下附加参数:
Out-File 包括以下附加参数:
有关这些参数的更多信息,请参阅帮助; 例如get-help out-file -parameter append.
And*_*ndi 15
Out-File除非设置了-NoClobber和/或-Append标志,否则具有覆盖输出路径的行为.Add-Content如果默认情况下输出路径已存在,则会附加内容(如果可以).如果文件尚不存在,则两者都将创建该文件.
另一个有趣的区别是,Add-Content默认情况下会创建一个ASCII编码文件,默认情况下Out-File会创建一个小的endian unicode编码文件.
>是一个别名的语法糖Out-File.它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
| 归档时间: |
|
| 查看次数: |
82899 次 |
| 最近记录: |