1.2.1 学习PowerShell的历史
2 A& L/ I: Q8 i v0 z
在1.1.2章中。我们描述了为什么微软需要改良命令行。这章我们谈论我们是怎样改良他的。
- f4 |$ p2 r2 A
我们详细的谈论为什么创立了新的语言。这是一个人们对PowerShell问的最普通的问题。(后面“你是个有
% M1 B: h1 N" \1 X0 L) }- ?* u
- ~* J, c) |" ~9 y4 Z# K新奇想法的伙子吗”).人们问道,为什么不用已有的UNIX SHELL之一呢,或者为什么不扩展已有的命令行
$ o$ C% U- f3 M. V
7 B. \% G* o& m+ r呢。
8 d& G. V% ~2 z, v* A( f
在操作中,我们一开始确实用了已存在的SHELL语言。开始,我们用了POSIX标准shell作为shell的语法。
+ T4 Z% L/ m( `7 {* C
POSIX是一个成熟的命令行也存在于巨大的多样性的平台.这些平台里包括windows.它基于UNIX Korn shell
c% Q$ V( R% ~* p) t3 ^! @ ~
1 h i* [ C4 b的子集,它自己也是最初的Bourne shell的超集。我们用POSIX作为建设的标准,然后考虑怎样去适应
2 q' ` v5 z) R2 g+ _4 S5 u" T
1 A8 F# |) t' L+ @
windows环境继承时需要适应的不同点。我们要学习UNIX环境优化的方法,优化WINDOWS环境来得到
0 }$ z7 y) K# q! J9 \& i v1 c6 P" l a6 S- F5 g4 v% P6 _; l$ v
一个优化的SHELL。开始时,经典的SHELL只能处理字符串,甚至,数字操作符起到了把字符串转变成数
) z* r T# X8 L7 s, s# R" n- ?
- |* e' j% {* J
字的工作,在表演操作中,数字又被转变成了字符串。PowerShell的核心目标是保护windows数据的类
& H) z" O9 r* C8 s1 ?; q9 m# O
& S+ d6 |6 P2 {9 i型, 我们不能简单的用POSIX shell来作这个.这个因素比其它的因素嵌入了更多的语言设计。然后,我们
6 P3 Z6 ^+ H& u& i3 Y. d, V& p# y6 x6 Q" o( T m; V7 N6 i2 |8 e
想支持更多的语言脚本经验,比如,你平常用的那些脚本语言,像VBScript,Perl,或Python.用一个比较自
4 |! o, O6 q) G: X0 A* v6 t; r) X
, d8 B8 H+ u% `( g
然的表达式语法,你可以使windows管理对象工作更加容易。现在我们只要开始考虑如何在shell中让这
5 x$ K: T) k4 w: V2 F C8 V; o
0 B* h" ]! j& @$ i% G9 g/ y% h1 _些对象成为可能。
- i9 O+ V- b' t2 N( I* e1.2.2学习.NET
. B& n) c3 d% u/ b+ M1 }* l2 Z r& B8 P开发任何计算机语言中最大的挑战是决定如何表现那种语言中的数据。对于PowerShell,关键要考虑调
9 G# y; m4 N* u$ P7 s4 T! {) s! {) ~
% ^9 _9 P. Q$ z整.NET对象模式。.NET作为一个统一的对象表达式,跨越了微软所有组织。它是一个巨大的有野心的对
y e2 l/ u2 R" o6 B( Y
& n2 s! T, J; ^5 i/ V. @8 H7 j8 h
象花费了很多年来达到这种成就。在使用这种公共的日志模型时,windows所有的组件可以共享并且被
2 {" Q9 A1 i2 e4 G6 t2 ^4 a0 [$ z
每个其它的数据理解。
1 X& F- R7 s0 t7 U
一个.NET最有趣的的特性是PowerShell是一种自描述的.NET对象模型.这,意味着,对象它自己包含了对
2 d4 _2 _3 C `
. p- Y# A& m& x! z象它自己结构的描述信息,这在一个交互式环境中很重要.当你需要有能力处理一个对象时并了解它可以作
9 \* G5 M2 T! C5 V A1 P4 |5 H2 x. y1 c3 ?! R
什么时,需要用到它。举个例子,当PowerShell从系统日志中收到一个日志对象时,用户可以在事件生
5 i1 C g8 G* t/ g" B& [# u& f
y1 A6 B0 b8 T成时简单的检阅对象来看它的数据戳。
1 e1 m/ r( a+ l
传统的基于文本的shell很容易识别,因为所有的东西都是文本的。文本很棒,你得到什么就能看到什么
4 ]1 @2 m9 @ [: t
9 v$ w6 } f8 w7 `' P5 y。不幸的是,你只能看到所有你得到的东西。用文本你不能识别很多机智的诡计直到你把目标转向别的
W9 P- y, M% U$ c' g
% b, O4 j1 Z6 {# i/ w! N1 E
其它的东西。举个例子,如果你想要看一个文件的总体大小,你可以得到一个路径列表,也许格式像下面
1 o. \5 j" o1 T% K$ b
1 {( I9 M4 c9 i; a
的东西:
* o% A5 D _7 T& M" u02/26/2004 10:58 PM 45,452 Q810833.log
4 `, V5 w4 I. G02/26/2004 10:59 PM 47,808 Q811493.log
1 {3 \8 q0 d5 _9 G
02/26/2004 10:59 PM 48,256 Q811630.log
3 R+ I: A" }4 o; o0 Y9 r) [
02/26/2004 11:00 PM 50,681 Q814033.log
/ F$ \# O/ \, E% K, Z
在这段文本里,你能够看到文件大小,但是它并没有什么用.你可以选择一个排序的片断从32行开始,39
: t( M% Z4 _' p9 P% ~% r: @. g( S( l7 H
行结束,把逗号删除,然后把这些字符转变成数字。甚至删除逗号也需要机智,因为上千个分隔符可以
' b- q% x0 F; G6 t( Y! t
: N2 ~1 g% P: C3 i. M) J
改变计算机设置的依赖关系。别的方面,也许它不是一个逗号,而是一个句号。或者根本什么都不是。
% ?1 v& P' h" Q/ |0 T* b
: d4 [6 [4 B7 V( _# B9 O; V8 F s& j如果你只是想看第一个位置的文件大小,应该比较容易。这就是.NET给PowerShell带来的:自描述的数
& P1 G, o' @+ T% F" V' j1 i* q0 G% P: ]8 B( r
据有利于理解并操作,除非有必要不需要转变为文本。选择了.NET对象模型也带来了附加的好
9 L4 A4 E7 u+ m. C) ?
: u3 L# j7 p9 L) C, [+ y% K) K2 h处,PowerShell允许直接使用.NET框架中的扩展库.它带给Powershell新的语言稀有的宽广的范围.这是一个
" d' E; v. ~; P: i) f$ s: ~3 z% i9 E7 w; P( h4 A$ X
简单的例子,显示.NET带给环境的好处。比如:我们想要看1974年12月13号是一周里的哪天。
( @0 O. M5 c. X$ u: G1 G! O+ w我们可以看到PowerShell是这样显示的:
) |5 Q4 b% `4 ^6 O C& {: Z; MPS (1) > (get-date "12/13/1974").DayOfWeek
) x, G' n+ F' o4 b% r
Friday
0 Q8 B# H+ k! N. e在这个例子里,get-date命令返回了.NET DateTime对象,那是个计算日期对应的day of week的属性。
2 {: a( I! j2 H) H5 O3 @4 k( {, o+ @2 W8 d* U& x% X
PowerShell队伍不需要建立一个日期和时间的库来操作PowerShell例程----在前面我们使用免费的.NET同
2 D1 ~( e8 n+ U( e5 b4 j
6 H; K+ Z7 x( l* c" j0 o- V. R样的时间日期对象在系统中运行着。举个例子,比如我们想要判断两个文件哪个创立的比较早些。在基
) M6 F5 t% f7 G5 L: t6 u- Q$ R
" m9 m5 ]' L4 e# w* L( U* u
于文本的shell中,我们必须得到一个包括文件被修改时间的字符串,用某种方法把那些字符串转换成数
% V6 h* U0 Z. B O
: [1 F- p: \0 l: M8 O( y字,然后比较他们。在PowerShell中,很简单:
' n ^- c' V* @$ ZPS (6) > (dir data.txt).lastwritetime -gt
) Q J. n! X' a- n% K6 C>> (dir hello.ps1).lastwritetime
) o3 [, n* I1 G+ b0 w$ ?4 K( v
>>
1 r5 m/ t, D8 M) q4 E
True
/ |, Z5 y% {8 k! J9 K4 g我们用dir命令来获得文件信息对象简单的比较每个文件的写入时间。没必要进行字符串分析.
' ]6 F0 j: { R- e% z
下一章讨论面向对象程序的基础。