在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除非设置了-NoClobberand / 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,使用'řž'上述代码页中具有不同代码的字符串进行了测试)。