首页 > 代码库 > (17)Powershell中的重定向运算符

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

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

    重定向运算符有什么用 ?

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

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

运算符说明示例
>
将输出发送到指定文件。PS D:\> Get-Process > process.txt
>>将输出追加到指定的文件。PS D:\> dir *.txt >> process.txt
2>将输出中的错误发送到指定的文件。PS D:\> Get-Process none 2> errors.txt
2>>
将输出中的错误追加到指定的文件。该运算符是在实际使用中使用频率最高的重定向运算符。PS D:\> Get-Process none,powershell 2>> .\errore.txt
2>&1
将错误发送到成功输出流。这个需要注意,命令执行成功的信息会显示,但是错误的信息并不会显示。PS D:\> Get-Process none,powershell 2>$1

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

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

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

    

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

PS D:\> Get-Process > process.txt

    与以下命令是等价的。

PS D:\> 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 D:\> $OutputEncoding
IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 20127

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

    

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

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


    重定向运算符中的1、2到底是什么意思 ?

重定向运算符中的数字所代表的输出信息种类
1Output/Success
2Error(错误信息)
3Warning(警告信息)
4Verbose(详细信息)
5Debug(调试信息)

    以上表格中的重定向运算符是在 Powershell 中的所有版本中都支持的输出信息种类的重定向。在 Powershell 3.0+ 还支持以下重定向运算符。    

运算符说明
3>
将警告信息重定向到指定的文件。
4>>
将输出的详细信息追加到指定的文件。
5>&1
将调试信息输出到成功流。需要注意,命令执行成功的信息会显示,Debug信息不会显示。
*>将所有信息(以上列出的5种)重定向到指定的文件。

    这些运算符的用法同之前表格中的运算符的用法完全类似。这里不再一一列举。


本文出自 “花开花落” 博客,谢绝转载!

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