PowerShell中格式化命令和输出命令
今天, 我将为您介绍如何使⽤格式化和输出命令. 在PowerShell中,负责进⾏格式化和输出的是三类cmdlet。他们分别是:Format-*、Out-*和Write-* 。顾名思义,Format-* 主要是⽤来对信息进⾏格式化操作,Out-*⽤于指定输出设备,⽽ Write-* 为 PowerShell 宿主(Host)输出的更多有⽤信息提供了快捷访问接⼝。
我们要将对象输出到控制台或打印机等位置前,我们⾸先必须将对象格式化成为字符串的形式。⼀个对象可能包含⼏⼗种属性信
息,PowerShell的开发者已经考虑到我们在⽇常使⽤时,不会使⽤⼀个对象的所有信息,因此默认情况下只保留该对象上最主要的⼏种属性。让我们来看看进程对象默认会显⽰哪些属性。⾸先看看进程对象究竟有多少个属性:
PS C:\> (Get-Process Idle | Get-Member -MemberType Property).Count
51
在上⾯例⼦,⾸先使⽤Get-Process命令返回表⽰Idle进程的对象,并通过Get-Member命令返回该对象上所有属性,最后我们给出该对象的属性个数(打印这些属性太占地⽅了,你可以把Count去掉,检查返回
的结果)。让我们看看PowerShell默认情况下会输出哪些属性吧:PS C:\> Get-Process Idle
Handles  NPM(K)    PM(K)      WS(K) VM(M)  CPU(s)    Id ProcessName
-------  ------    -----      ----- -----  ------    -- -----------powershell创建目录
0      0        0        16    0              0 Idle
正如前⾯所介绍的,PowerShell默认只会返回对象上⼀部分属性信息,究竟显⽰哪些属性是通过定义在ETS系统中的信息决定的。Format族包含了:Format-Custom、Format-List、Format-Table和Format-Wide四个命令。在⼤多数情况下,Format-Table是PowerShell默认使⽤的格式器。Format-List的输出类似上⾯输出进程属性的格式,每个对象将会占⼀⾏。⼀⾏内包括该对象的多个主要属性,如果该属性信息太长,PowerShell就会将该信息截断。让我们看⼏个管理PowerShell最常⽤的例⼦:
PS C:\> Get-EventLog -LogName 'Windows PowerShell' -Newest 10 | Format-Table
Index Time          Type        Source                InstanceID Message
----- ----          ----        ------                ---------- -------
1029 五⽉ 31 21:38 Information PowerShell                    400 Engine state is changed from None
1028 五⽉ 31 21:38 Information PowerShell                    400 Engine state is changed from None
1027 五⽉ 31 21:38 Information PowerShell                    600 Provider "Certificate" is Started. ...
1026 五⽉ 31 21:38 Information PowerShell                    600 Provider "Variable" is Started. ...
1025 五⽉ 31 21:38 Information PowerShell                    600 Provider "Registry" is Started. ...
1024 五⽉ 31 21:38 Information PowerShell                    600 Provider "Function" is Started. ...
1023 五⽉ 31 21:38 Information PowerShell                    600 Provider "FileSystem" is Started. ...
1022 五⽉ 31 21:38 Information PowerShell                    600 Provider "Environment" is Started. ...
1021 五⽉ 31 21:38 Information PowerShell                    600 Provider "Alias" is Started. ...
1020 五⽉ 31 15:43 Information PowerShell                    403 Engine state is changed from Available to
<
这个例⼦显⽰PowerShell最近10个⽇志的⽇志信息. Format-Table为了保证每个对象只输出⼀⾏,只会输出那些较重要的信息,⼀般对对象的检索,使⽤Format-Table就是最好的办法。
其他⼏个命令, 您可以参照PowerShell的帮助, 或我翻译的帮助信息详细学习.
看完了负责格式化对象输出信息的cmdlet,我们需要考虑该把这些信息输出到什么位置了。Out族包括了:Out-Default、Out-File、Out-Host、Out-Null、Out-Printer、Out-GridView和Out-String。
Out-Host命令,就是将显⽰结果返回给宿主程序,由宿主程序展现给使⽤者。Out-Default默认就是使⽤Out-Host进⾏输出,但是根据PowerShell⽂档的描述,Out-Default⽤来提供⼀种占位符的特性,你可以在脚本完成后,重新修改Out-Default来控制整个程序的输出。Out-Null的作⽤就是将输出丢弃,在很多时候,如果我们不关⼼命令的返回结果,⽽只关⼀条命令产⽣的某些影响时,我们可以将该命令的输出通过管道发送给Out-Null。例如:
PS C:\> New-Item TestIt -Type dir
Directory: Microsoft.PowerShell.Core\FileSystem::C:\
Mode                LastWriteTime    Length Name
----                -------------    ------ ----
d----        2007-9-16    21:10            TestIt
PS C:\> New-Item TestIt -Type dir | Out-Null
New-Item : Item with specified name C:\TestIt already exists.
At line:1 char:9
+ New-Item  <<<< TestIt -Type dir | Out-Null
PS C:\> Remove-Item TestIt
PS C:\> New-Item TestIt -Type dir | Out-Null
PS C:\>
我们⾸先创建了TestIt的⽬录,默认情况下,New-Item返回新创建的⽬录,该对象被输出到控制台上。我们接下来试图再创建⼀次该⽬录,并将输出信息丢弃。然⽽,由于该⽬录已经存在,因此创建失败,命令给出了错误提⽰。这⾥我们需要注意错误信息并没有被丢弃!接下来我们删除⽬录TestIt,再次执⾏
创建命令,这次,屏幕上没有显⽰创建的⽬录信息。
最后,我们来看看Out-File。很多时候,我们需要将某种编码的字符串存储为其他编码形式。我们可以简单的使⽤Out-File的参数Encoding 来设置输出信息的编码格式。这些编码包括了:“Unicode”、“UTF7”、“UTF8”、“UTF32”、“ASCII”等等。有时候,我们还会遇到如果将信息写⼊⽂件中。如果该⽂件已经存在,我们可能希望信息继续追加到⽂件的末尾,或者当⽂件已经存在时,我们希望覆盖这个⽂件。通过参数Append,我们可以告诉Out-File究竟是覆盖⽂件,还是在⽂件的末尾进⾏追加。让我们看看简单的例⼦:
PS C:\> "我是第⼀⾏!" |
PS C:\> Get-Content C:\
我是第⼀⾏!
PS C:\> "我是第⼆⾏,但是我要试试覆盖第⼀个⾏!!" |
PS C:\> Get-Content C:\
我是第⼆⾏,但是我要试试覆盖第⼀个⾏!!
PS C:\> "我是第三⾏,让我跟在第⼆⾏后⾯吧" | Out-File -
PS C:\> Get-Content C:\
我是第⼆⾏,但是我要试试覆盖第⼀个⾏!!
我是第三⾏,让我跟在第⼆⾏后⾯吧

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。