zhang-snail

导航

 

(17)Powershell中的重定向运算符

默认情况下,Powershell 把输出发送到屏幕显示。但是,Powershell也可以将输出重定向至一个文本文件,或将错误输出重定向至常规输出流。

重定向运算符有什么用 ?

重定向运算符意味着我们可以将命令的输出信息输出到指定的文件,完全满足脚本中的log的要求,即可以利用重定向打印脚本或命令执行的详细信息。

Powershell 中有以下重定向运算符。

重定向运算符的语法如下:

<input> <operator> [<path>\]<file>

需要注意的是,如果指定的文件已存在,则不追加数据的重定向运算符(> 和 2>)将在不发出警告的情况下覆盖文件当前内容。但是,如果该文件是只读、隐藏或系统文件,则重定向将会失败。追加重定向运算符(>> 和 2>>)不会写入只读文件,但会在系统或隐藏文件中追加内容。

另外需要注意的是,重定向运算符只是 Powershell 提供的一种语法糖(使用起来很方便,但是也更抽象)。例如:

Get-Process > process.txt

与以下命令是等价的。

Get-Process | Out-File process.txt


提到 Out-File 不得不提以下Powershell 重定向的编码问题。

Powershell 重定向运算符 > 在重定向文件时,使用的哪一种编码呢?是ASCII 还是 Unicode ?答案是这取决于重定向运算符 > 右侧是文件还是程序。

Powershell 中的String 类型使用的是16位的Unicode编码,是 .Net Framework 中 System.String 类的实例。所以当你在Powershell中使用重定向运算符时,使用的Unicode编码。而Unicode编码也是Out-File 命令重定向文件时的默认编码。

那如果重定向运算符 > 是程序,而不是文件时,使用的编码取决于Powershell内置变量 $OutputEncoding 的值,而 $OutputEncoding 的默认值就是ASCII(许多程序并不能正确处理Unicode编码,编码是计算机中比较复杂的知识点,感兴趣的可以了解下两种编码的不同)。以下是在我的电脑中 $OutputEncoding 的值。

PS C:\Powershell> $OutputEncoding 


BodyName          : iso-2022-jp
EncodingName      : Japanese (Shift-JIS)
HeaderName        : iso-2022-jp
WebName           : shift_jis
WindowsCodePage   : 932
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 932

当然这个值可以是可以更改的,使用例子参考 Powershell 的设计者 Jeffreyblog https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/

所以在重定向 Powershell的输出时,可以使用语法糖(>),也可以使用 Out-File 命令,使用 Out-File 的好处是,通过 -encoding 参数可以指定编码格式。

另外需要注意的是,如果要将内容强制重定向到只读、隐藏或系统文件时,可以使用带 Force 参数使用 Out-File cmdlet。


posted on 2024-01-22 13:48  zhang-snail  阅读(63)  评论(0编辑  收藏  举报