Windows PowerShell进阶IO操作之写入

今天接着讲IO 操作的第二部分:写入。

用法

目前我所知道的powershell有以下几种写入命令: 不要混着用

> & >>, 默认Unicode encoding,文件不存在时,会创建文件.

out-file, 覆盖或者添加(-append参数)文本到文件,可以指定-Encoding,默认Unicode,文件不存在时,会创建文件.

按照微软官方的说法: > 和不带任何参数的out-file效果一样

The Out-File cmdlets sends output to a file. You can use this cmdlets instead of the redirection operator (>) when you need to use its parameters.

add-content 添加文本到文件,文件不存在时,会创建文件.

注意add-content可能会改变原有string的格式. 以下为官网解释:

When you pipe an object to Add-Content, the object is converted to a string before it is added to the item.The object type determines the string format, but the format might be different than the default display of the object. To control the string format, use the formatting parameters of the sending cmdlets.

set-content 重写(覆盖)文本到文件

[System.IO.File]::WriteAllText(),覆盖原有文件,可指定encoding

[System.IO.File]::WriteAllLines(),写入一个数组/集合,每个数组/集合元素一行,覆盖原有文件,可指定encoding

[System.IO.File]::WriteAllBytes(),字节写入,针对图片之类的,覆盖原有文件

下面3个是上面.NET write方法对应的append方法,一样用法,只不过他们是添加到文件,而不是覆盖.

[System.IO.File]::AppendAllLines()

[System.IO.File]::AppendAllText()

[System.IO.File]::AppendText()

区别

文件锁(写的同时,别的程序或者命令不能访问这个文件)

Out-File不会锁文件

Set-Content会锁住文件

.NET方法我没测,但是我查了下,应该都是有锁的

所以针对需要长时间参奏的IO,不要用Set-Content和.NET方法。

WriteAllText method acquires an Exclusive Lock from the file system before it starts writing and releases it when it's finished

Encoding

Out-File默认Unicode (UTF-16LE)

Set-Content默认ASCII (US-ASCII) in PowerShell 3+

Set-Content支持-Encoding Byte而Out-File却不支持,所以上面[System.IO.File]::WriteAllBytes()示例可用下面方法改写.

注意set-content接收的数据也要是byte,所以get-content 我们也用了-Encoding Byte参数.

格式化

Out-File会原样的保持console里面的输出样式到文件中. 所以如果一个文件夹中有2 个file,(dir) | out-file out.txt会使out.txt有11行

而(dir) | set-content out.txt只会将这2 个file的name写入out.txt,因此只有2行.

Set-Content is designed for string processing. If you pipe non-string objects to Set-Content, it converts the object to a string before writing it. To write objects to files, use Out-File.

文件不存在时创建文件

Set-Content在有时候是不会创建文件的,比如针对一个空的文件夹,如下createfile.txt最终是不存在的,而跑(dir) | out-file createfile.txt 则会创建,大家可以试下.

管道

set-content从管道接受的是文件,所以你可以一次性将string写到多个文件里面

Out-File从管道接受的是data,所以你可以一次性将多个string写到一个文件.

综上,个人推荐平时优先使用out-file,下面是我平时用的一个写log的函数,供大家参考下。

参考链接,大家自己多动手,感受不同命令带来的不同结果:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-file?view=powershell-6

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/add-content?view=powershell-6#notes

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-content?view=powershell-5.1

https://msdn.microsoft.com/en-us/library/system.io.file(v=vs.110).aspx#Methods

https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx

https://stackoverflow.com/questions/10655788/powershell-set-content-and-out-file-what-is-the-difference

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180426G1N90100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券