在PowerShell中,Out-File
和之间有什么区别Set-Content
?还是Add-Content
和Out-File -append
?
我发现如果我对同一个文件使用这两个文件,则文本完全是mojibaked。
(第二个小问题:>
是的别名Out-File
,对吧?)
在PowerShell中,Out-File
和之间有什么区别Set-Content
?还是Add-Content
和Out-File -append
?
我发现如果我对同一个文件使用这两个文件,则文本完全是mojibaked。
(第二个小问题:>
是的别名Out-File
,对吧?)
Answers:
这是经过几个月的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 '?'
yields $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-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
。
Out-File
在某些情况下长线会出现问题。例如: $x = [pscustomobject]@{A=('a' * 500); B=('b' * 500)}; $x | Out-File -Path myfile.txt
。
Out-File
除非设置了-NoClobber
and / or-Append
标志,否则它具有覆盖输出路径的行为。Add-Content
如果默认情况下已经存在输出路径,则将附加内容。如果一个都不存在,两者都将创建文件。
另一个有趣的区别是,Add-Content
默认情况下将创建一个ASCII编码文件,默认情况下Out-File
将创建一个小的endian unicode编码文件。
>
是的别名语法糖Out-File
。它Out-File
带有一些预定义的参数设置。
echo "" > $null | Add-Content abc.txt
此操作不会创建file abc.txt
,而Out-File会创建。
Add-Content
不会收到任何东西。如果Add-Content
什么都没收到,为什么要创建文件?另一方面,可以对文件外存储提出相同的问题。
gci $folder | Out-File log.txt ; cat log.txt
而作品却会gci $folder | Add-Content log.txt ; cat log.txt
炸毁
Set-Content
使用该文件时,其他应用程序将无法使用该文件。
好吧,我不同意... :)
所以:
ls | Add-Content test.txt
和
ls | Out-File test.txt
会给您完全不同的结果。
不,'>'不是别名,它是重定向运算符(与其他shell相同)。并且有非常严重的局限性...它将以相同的方式显示线条。Out-File具有-Width参数,可帮助您避免这种情况。同样,使用重定向运算符,您无法决定要使用哪种编码。
HTH Bartek
>
与Out-File是同一件事。他们调用相同的代码。摘自Bruce Payette的PowerShell in Action第二版(Kindle位置4646):In fact, myScript > file.txt is just “syntactic sugar” for myScript | out-file -path file.txt In some cases, you’ll want to use Out-File directly because it gives you more control over the way the output is written.
>
并不完全等同于out-file
。如果设置$PSDefaultParameterValues["Out-File:Encoding"] = "UTF8"
,它将被忽略>
。
Set-Content
默认编码:转换为(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1,Powershell 4.0,CurrentCulturecs-CZ
,CurrentUICultureen-GB
,ANSICodePage1250
,OEMCodePage852
,使用'řž'
上述代码页中具有不同代码的字符串进行了测试)。