Powershell的设置内容和out-file有什么区别?
在PowerShell中, out-file
和set-content
什么区别? 编辑:或者add-content
和out-file -append
?
我发现如果我同时使用这两个文件,那么这个文本就是一团糟。
(第二个问题, >
是out-file
的别名,对吧?)
下面是我在Powershell几个月的经验和一些科学实验之后得出的结论。 从来没有发现任何在文件中的:(
[ 更新:大部分现在似乎都被更好的logging。]
读取和写入locking
当Out-File
运行时,另一个应用程序可以读取日志文件。
Set-Content
正在运行时,其他应用程序无法读取日志文件。 因此, 请勿使用Set-Content
来logging长时间运行的命令。
编码
Out-File
默认保存为Unicode
( UTF-16LE
)编码(虽然可以指定),而Set-Content
在PowerShell 3+(也可以指定)中默认为ASCII
( US-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
。
那么,我会不同意… 🙂
- Out-File具有-Append(-NoClober是为了避免覆盖),将添加内容。 但是这不是同一个野兽。
- 命令| 添加内容将使用.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
。