首页 > 代码库 > (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到底是什么意思 ?
重定向运算符中的数字 | 所代表的输出信息种类 |
1 | Output/Success |
2 | Error(错误信息) |
3 | Warning(警告信息) |
4 | Verbose(详细信息) |
5 | Debug(调试信息) |
以上表格中的重定向运算符是在 Powershell 中的所有版本中都支持的输出信息种类的重定向。在 Powershell 3.0+ 还支持以下重定向运算符。
运算符 | 说明 |
3> | 将警告信息重定向到指定的文件。 |
4>> | 将输出的详细信息追加到指定的文件。 |
5>&1 | 将调试信息输出到成功流。需要注意,命令执行成功的信息会显示,Debug信息不会显示。 |
*> | 将所有信息(以上列出的5种)重定向到指定的文件。 |
这些运算符的用法同之前表格中的运算符的用法完全类似。这里不再一一列举。
本文出自 “花开花落” 博客,谢绝转载!
(17)Powershell中的重定向运算符