打印

[分享] POWERSHELL的应用的学习笔记(原著:BRUCE PAYETTE)

本主题被作者加入到个人文集中
2.4 格式化和输出
' t; i1 c- o* G; F! x8 E( R我们开始关注PowerShell是怎样配置显示输出的。普通的,我们只能运行命令然后依赖系统配置来显示结果。有时候我们用Format-Table和Format-List之类的的命令来对显式的外观作个普通向导,只是内容不是太详细。让我们对此进行挖掘和看它如何工作的。/ A) u- c8 Z" a/ P- r+ U
PowerShell是基于类的系统,使用类来决定事情是怎样显示的。无论如何,普通的对象不用知道怎样显示自己。PowerShell用包含格式化信息的各种类型对象的数据库处理这些。这是可扩展类系统的一部分,也是整个系统的重要组件。这种可扩展类的系统充许PowerShell在已经存在的.NET对象中增加新的行为。默认的格式化数据库被存储进PowerShell的安装路径中,你可以用$PSHOME脚本变量来得到这个路径。这是一份文件的清单:0 F6 v) u% r. @. |, o- R1 A" I/ d
PS (1) > dir $PSHOME/*format* | ft name
9 S' Q5 J. g4 a6 wName
2 B7 M9 E a* Z----
9 I6 s& V$ ]( mCertificate.Format.ps1xml
( C3 |1 ]' F7 \9 u; _6 oDotNetTypes.Format.ps1xml' q4 O$ ~3 l/ |8 N. w
FileSystem.Format.ps1xml1 D( s3 l$ ^* j( U9 D4 U f
Help.Format.ps1xml7 P5 c) v6 j8 z$ }4 [- R
PowerShellCore.Format.ps1xml( x- V) D; M- R! E U+ r/ m
PowerShellTrace.Format.ps1xml7 s7 Y9 [& g, D$ @
Registry.format.ps1xml( H( M0 m' Q$ g. I9 F! J
你可以多多少少的配置包含了描述的类型事物.(读完本书剩下的部分后,其它的事物也变得清楚起来.)+ l# }% R. J6 u1 ]1 k1 p: V
这些文件是包含了描述的XML文档,这些文档相当的复杂以至于很难写.最终用户有可能添加他们自己的类型描述,但这个举动超出了本篇的领域.这一篇中最重要的是理解怎样格式化和输出命令.
欢迎骚扰                

TOP

2.4 格式化和输出8 r' c, b% I: n- ?* R0 x* r
我们开始关注PowerShell是怎样配置显示输出的。普通的,我们只能运行命令然后依赖系统配置来显示7 j% c+ O& }, _, x8 h
( s* E' @$ x# h7 |
结果。有时候我们用Format-Table和Format-List之类的的命令来对显式的外观作个普通向导,只是内容* E" o) a/ i9 p! |1 X
* X7 p% R4 Y% ?) [3 q
不是太详细。让我们对此进行挖掘和看它如何工作的。
) x5 H0 q/ @7 {; r" q1 tPowerShell是基于类的系统,使用类来决定事情是怎样显示的。无论如何,普通的对象不用知道怎样显
; @% `1 \8 U; X+ o J) h" E
3 k' B& }+ i; ^6 |示自己。PowerShell用包含格式化信息的各种类型对象的数据库处理这些。这是可扩展类系统的一部分8 Y/ V% i' [, u- O7 A

. A* t7 n" [2 k. L4 a4 K,也是整个系统的重要组件。这种可扩展类的系统充许PowerShell在已经存在的.NET对象中增加新的行* y# B6 T7 y, w0 p- t

9 I3 y5 _# W& W2 x" s4 W2 _为。默认的格式化数据库被存储进PowerShell的安装路径中,你可以用$PSHOME脚本变量来得到这个路
3 x$ i( A; O8 `& [9 t, @+ C* N4 u/ C5 b7 b- a7 |( F
径。这是一份文件的清单:
9 ]7 _+ y2 k$ h' v2 g4 dPS (1) > dir $PSHOME/*format* | ft name! w6 @7 `; R2 z: h' v7 V2 i: I
Name* C& f8 U& h# V1 v6 g2 t
----
# }# C. @' M: ^7 k, i. kCertificate.Format.ps1xml
! Q: J3 ?; G" b+ E" IDotNetTypes.Format.ps1xml
~0 u" u2 k% C" ?5 j/ L: ~4 X' mFileSystem.Format.ps1xml
! G/ g- E- a+ P( S6 SHelp.Format.ps1xml
' v9 r% }2 w/ A/ V8 s9 rPowerShellCore.Format.ps1xml- E" l; ]6 S! Q5 V, T; I0 U
PowerShellTrace.Format.ps1xml
6 _& k! l" ?, ~/ |Registry.format.ps1xml
8 H, [1 m1 Y) {& D: k你可以多多少少的配置包含了描述的类型事物.(读完本书剩下的部分后,其它的事物也变得清楚起来.)
6 X6 \% ]# L! e& A3 h. ?+ Q3 Y这些文件是包含了描述的XML文档,这些文档相当的复杂以至于很难写.最终用户有可能添加他们自己的类
* Q- Z: {2 A X k& u. P
9 k' v5 V& F3 ^; ^& }' p# e型描述,但这个举动超出了本篇的领域.这一篇中最重要的是理解怎样格式化和输出命令.
; r# M+ W/ y8 ~% k3 T1 _2.4.1 格式化的cmdlets
2 z+ I' C! ^- X; @6 i3 c& ~被对象类型控制的显示信息已经被显示出来,但是用户可以用"foruma-"命令选择符合的对象:# I* \( F# K- |/ M1 N, }" k B) k3 n; i
PS (5) > get-command format-* | ft name
: e" S8 |; M# Q( p0 Z! Y* T0 xName# B2 j5 w% D$ P+ y
----# _6 x0 f* M6 t- R& P1 e
Format-Custom
3 ?+ [! M- _* x! N1 {Format-List3 b) D0 F' o2 v0 O3 P
Format-Table
* Q J6 v# \0 v7 e# A* F6 n5 IFormat-Wide E' S: ^8 X+ G' V4 N t
形式上,事情就像一个表或清单.他们是这么工作的.format-table cmdlet把一系列的列通过屏幕显示了出来:
. d& r+ @4 U. ?5 ]. @$ IPS (1) > get-item c:\ | format-table
5 u' A6 D& X. m' s+ z3 _ Directory:
% {; @/ u+ k; e+ XMode LastWriteTime Length Name
% p1 z1 e7 w7 s---- ------------- ------ ----
% z) `4 d6 Q! B, z* o: W6 {d--hs 4/9/2006 10:04 PM C:\
/ E6 ~/ d5 Z P7 |. B2 \* z默认的,它试着使用最大的宽度来显示和猜测详细的字段是怎样的.这让你一开始就在最短时间内看到数& q+ U0 g* M; ?( d, ^0 @8 A! I

: n" v) {9 w/ M" q据.(流行为),但是并不会总是产生优化的结果.你可以用-autosize switch来得到一个好的显示结果,这样会需5 r2 R( o1 C/ K. V$ }

4 ] S0 f' }( U2 p要在显示他们前格式化每个元素的进程.在用每个字段时我们不得不配置好最好的宽度.这个例子的结果如
$ I c% W7 K% [" P1 F% U$ k% f( C( m1 Q% n% i, n9 q/ f
此:# m0 ?" [6 Z ~* y) @9 ^- k
PS (3) > get-item c:\ | format-table -autosize
4 g- A9 {2 F/ y9 p Directory:
' x/ h( h7 f$ \9 ]Mode LastWriteTime Length Name/ ^# k5 ~9 U) s' |8 [ A- ?
---- ------------- ------ ----8 q) M* t7 P) p; C
d--hs 4/9/2006 10:04 PM C:\
' Y7 }& n1 a0 EOkey----所以它看上去没多少不同:白空间把事情更压缩了.实际上,流默认的层相当的棒而且你不用使用" _* `2 D2 j6 ?) \" ?& b& e
. |- |, J/ P7 }+ T2 o
use-autosize,但是有时你可以利用这些提高事情的可读性.7 [6 d4 ]% U) o( C4 d5 v; c
format-list命令,再另一方面,下面用对象的一个清单显示了所有元素:
# V, L4 U3 T2 x) a% c4 ~PS (2) > get-item c:\ | format-list. ^/ H* g% w+ k; s- B' p( t# m
Directory:+ w8 l% v2 _. a
Name : C:\
+ F( i& j/ {& L2 t3 @CreationTime : 2/26/2001 3:38:39 PM
8 X& D$ `' V: V( ULastWriteTime : 4/9/2006 10:04:38 PM0 a9 [3 L d! o( x* F1 _
LastAccessTime : 4/11/2006 9:33:51 PM( @+ |6 s8 D( m7 K$ i$ O$ q
如果要显示多于一个的对象,将要显示一系列的清单.让我们用例子试试: b% Q& u7 K4 V1 D* M
PS (3) > get-item c:\,d:\ | fl
) a; X) M4 o! K5 b" D& P Directory:
K1 E a3 H1 u6 AName : C:\
/ A0 y. ]5 ?: ~- VCreationTime : 2/26/2001 3:38:39 PM0 X; r' \6 m- b ^
LastWriteTime : 6/21/2006 1:20:06 PM
: P! P/ r7 l5 A. Y# T) q1 R& nLastAccessTime : 6/21/2006 9:14:46 PM* ^7 [. ^7 ~5 e& a" `/ g, p
Name : D:\" r0 Y2 V. c. F% \/ {7 z" j- V, U5 A
CreationTime : 12/31/1979 11:00:00 PM
, ?' M6 f& r. v8 |! O* S: nLastWriteTime : 12/31/1979 11:00:00 PM3 C D" F! X5 G7 N& @9 S4 Q
LastAccessTime : 12/31/1979 11:00:00 PM0 \0 ^7 z a' c! `, n2 M+ v
最好的显示大量收集的字段的方法不适合全屏幕显示(显然-autosize交换方法对这种类型的输出不太适合)- y. x+ T" S( H9 U" Z
Format-Wide cmdlet在你想要使用一个简单的对象属性时使用一个简单的方法.屏幕在显示同样的信息时
, E( _, g/ i, Q将要把屏幕处理成一系列的列.比如这个例子:
" {4 M8 I6 `- I* D! Z; MPS (1) > gps s* | format-wide -Column 8 id
4 ~6 w2 Z' d8 ?1 T1372 640 516 1328 400 532 560 828
g5 a5 @9 K$ z( ^) L' b/ I876 984 1060 1124 4
4 n, |+ v( y, @- W7 }9 b' d这个例子中,我们将要用八列显示所有名字带"s"的所有进程的进程ID.这个处理机制充许密集的显示信息.
- e6 M7 n/ W1 a) i7 A! q& ^最后的处理机制是Format-Custom.这个显示对象将要保护对象的基础结构.更多的对象有一些结构包含其: M9 y1 o* n5 K' a" B9 p
- u9 J& p x7 l; {, k. }9 b; t
它对象,which,in turn,包含其它对象,这些可以产生极端冗长的输出.这是从Get-Item cmdlet的小部分的输出,
' `4 B% n( |- l' V9 v# @' ^用Format-Custom来显示:, s4 K" r6 v7 p& U1 Q3 L9 ~+ ^
PS (10) > get-item c:\ | format-custom -depth 13 |4 ]6 ]4 N# a
class DirectoryInfo" S% c% n/ n, `" V) P
{. r( V# Q1 m( ]3 v0 ]# z
PSPath = Microsoft.PowerShell.Core\FileSystem::C:\: K! B1 G3 C. I ^9 a5 [
PSParentPath =
/ b+ r4 k' U5 w" }/ L) {2 J PSChildName = C:\
9 B/ w+ g+ D$ P4 b0 R PSDrive =# K/ T2 \7 C+ b4 y2 D
class PSDriveInfo/ R6 u* F3 c6 ], Y3 i
{
4 X7 f! c+ X' Q' v' J CurrentLocation =
' m9 [1 v! o! S Name = C# h( X0 Z) b0 Y( `
Provider = Microsoft.PowerShell.Core\FileSystem2 O6 |) r( w. S1 D! ~% `
Root = C:\
; F& \, {. q2 b, Y5 y' ?7 d! e Description = C_Drive! A$ K" ?0 T% t% y6 p+ P& w. M
Credential = System.Management.Automation.PSCredential
1 e* @* d3 q/ P% p+ I# B6 O* ` }1 R) ?, m6 V* U8 x; s# `% N, C
全部的输出非常的长,需要注意的是,我们说它在depth 1处停止运行.你可以设想,这个输出结果是多么冗余
' |; b/ J- M& c [' @" E2 b6 Z q* r- P8 I! h- L% @4 r# ?! z1 h7 g9 H3 S
了!但是,为什么有这个cmdlet呢?因为它是有用的debugging tools,在你建立自己的对象或者仅仅探索.NET$ s3 o9 D. {2 ^7 _* _& ?- T

9 }9 o( r0 c5 h# r& Q. _/ W- ?类库中存在的对象时.你会发现,这是一个在当机时有脏对象时保存你后面的容器的方法.(脏,可以认为已经
* j3 K+ V9 ^# J, d" \' ]
2 I4 q$ T+ Y" d* n! j& l% q有修改但未进行提交的数据,当机时,这种数据应该是即时性的最宝贵的数据.但是脏对象嘛,大家可以讨论,
+ c0 v+ C& E- y3 Z6 u/ m
( Y1 F- ? ~* e9 [1 H7 y8 F0 w1 e下面的部分有谈到这个时,我会回来更正的.),而不仅仅作普通的每日性的基础工作.
欢迎骚扰                

TOP

2.4.2 输出cmdlets" D% q+ Z" i. f/ g& \ f
现在我们知道了怎样格式化东西,那么我们怎么输出呢?我们不用担心,因为,默认的,所有信息会自动输出.# m; g/ \& `! _
作者笔记:记下下面的三个例子,即使他们有同样的功能; m2 d* A" ^9 c# n3 J/ i
dir|out-default
9 p% |2 @3 ~: T% Wdir|format-table# x# M; c7 k9 I0 _, ]1 W6 e
dir|format-table|out-default
; b+ C; }$ M6 X9 O; O+ a6 h这是因为格式化进程知道怎样进行默认的输出,默认输出知道怎样查找对应的格式化进程,系统也知道怎样- d x6 w5 ]0 l5 x2 B
- {$ }) p8 Y) v: @
查找对应的进程.
4 K& h+ a% p, K5 P3 F使用格式化时,PowerShell在运行时有几个输出cmdlets.你可以使用Get-command command来查找他们:) n c* i7 ?6 f4 o
PS (1) > get-command out-* | ft name
( [5 A& V ~* qName/ q3 T/ b2 e1 {
----6 ]- U+ Q/ K6 { H$ |. y+ U; X5 }
Out-Default
& h7 @5 m6 `! l$ t, p$ BOut-File4 z# r4 m, ^2 G( ?) Q
Out-Host
9 x P5 Z7 E( ]Out-Null% {- e% ? }; @& t5 @% t
Out-Printer$ {6 |. r+ Y7 `+ C3 O
Out-String" ^( t% l: O/ c5 z( r' S
这里我们有些超出范围的选择.我们已经谈论了默认的输出.接下来我们谈论空输出。这是个简单的输出;1 }: Z& P) K/ h9 _: y! x
所有的空输出都将被抛弃。当你不关心命令的输出时就显得很重要。举个例子,mkdir命令输出路径的清
/ p. s9 F V- |5 w$ f. G# y% K
4 e; y2 ]9 l: f5 c) ~' ?! ?单被建立了。2 [0 Q9 L: }0 [/ X: h6 F; B2 p; ]
PS (1) > mkdir foo- `4 y, \& n- r- r0 X
Directory: Microsoft.PowerShell.Core\FileSystem::C:\Temp p: W# c9 s7 f3 M* J- @
Mode LastWriteTime Length Name( d; }" u6 l0 ~
---- ------------- ------ ----# q$ X5 P0 J3 P* n4 e4 ~1 ^! f/ F
d---- 6/25/2006 8:50 PM foo3 k0 ^1 I- X& O: s4 Z
如果你不想看到这个输出,把它放到空输出的管道中。先删除我们建立的路径,然后建立路径。
4 c; {# K. u. \& K: W/ K$ P$ bPS (2) > rmdir foo
% V& i& G+ B3 b! }- m) N) d! _; Y: APS (3) > mkdir foo | out-null
5 c+ @9 E! o7 fPS (4) > get-item foo
$ t0 H( h' D! j- L Directory: Microsoft.PowerShell.Core\FileSystem::C:\Temp
) Z. ?7 n+ n5 D" i6 }$ \Mode LastWriteTime Length Name
* U' ~3 r3 r& i+ j---- ------------- ------ ----/ L5 W" K; U, `% o5 `
d---- 6/25/2006 8:50 PM foo
* g6 n+ `' s5 E7 S% w最后,因为我们没有得到信息,我们来验证路径已经被建立了。. o9 ^* X! h+ n8 w, _
作者笔记 听众对I/O重定向的兴趣;OUT-NULL的管道和用$null作重定向在本质上是相同的。所以9 c: a# U4 _7 e1 D! o
mkdir foo | out-null- \. z8 A" C/ G" A9 q: K4 B# }
等价于* Y: t% G7 |8 q1 `! K% o+ z
mkdir foo > $null
' g& O, D- {* A5 c5 o) y接下来我们有输出文件.代替输出到屏幕上,这把输出放进文件里。(这个命令也在作文件输出时使用I/O
9 Y( R5 R1 j3 J6 X6 E/ v
0 c3 M h) }9 E. z" o重定向。)附加的写出格式化输出,输出文件有几个标志来控制输出是怎样写的。这些标志包括了添加文
5 E) O _3 I t2 L, l; f8 V. _% J( D' F. I# @' n1 ?
件的能力来代替替代它,强制写到指读文件里,然后在文件中选择输出编码。最后的项目是最有谋略的
, a4 \: @; n& ?. }/ b
, I+ d. I+ Z' }" E0 A# X。你可以选择Windows支持的很多文本编码。我们不能记得他们是什么,这是个谋略:用编码输入不存
0 L" M6 c2 h( m1 T, ?6 B
9 u0 d0 H* O, D0 _5 _% o# @在的命令:
' j0 E- X0 s5 z. Z! ZPS (9) > out-file -encoding blah+ u, ^8 b! Y7 g
Out-File : Cannot validate argument "blah" because it does
4 x5 W3 G3 Y/ ~not belong to the set "unicode, utf7, utf8, utf32, ascii, b& L; p" R/ f* d! s+ [7 ]
igendianunicode, default, oem".
0 ?; Q3 ^& f% w; W4 Q& n9 r, iAt line:1 char:19. c+ E4 F/ J2 {) B
+ out-file -encoding <<<< blah5 [& N- G- M5 X1 i1 C
PS (10) >
7 s3 [4 }: m) a9 _, {8 @你可以看到错误信息中所有存在的编码名都被显示出来。如果你不理解这些编码是什么,不要担心只是
1 t- R1 D* F. ?& R4 X v; P9 `0 Q
7 Z1 C a& ~+ Z8 F H* {8 l+ X让系统用默认值使用它们。
- r) g+ j m5 N/ X3 t. [& U/ L7 x* @作者笔记 当你喜欢在难题中运行输出编码或输入编码来解决这些麻烦时,建立文件时将要调用其它的程
) u" \* z6 E# s4 ^, N9 B$ A
2 C7 R. G7 L1 G$ [/ u序。* y9 [, b6 r' r9 d7 o& T9 r# C2 x
* h3 ` _5 s% |! a# `, Y3 d3 C
(未完)
欢迎骚扰                

TOP

本功能由奇虎搜索实现

相关主题

标题 作者 最后发表
[站外] 关于Windows 7:不可不知的七件事   [转帖] sz562 2008-09-05
[站外] 高数该怎么学啊?   [转帖] keeponmoving 2008-06-14
点击阅读更多关于的相关帖子  更多相关主题