第一条,所有参数将要用参数属性进行声明,PowerShell实时的用此项信息来自动决定cmdlet的参数。cmdlet使用者们不必要为参数语法提供任何的代码。他们实时的关心cmdlet是如何运转的。另一条,
4 d9 u* ^$ \' P f- s: `4 sValueFromPipeline是真正的计数法;这意味着参数可以通过管道行运行数值。(我们将要在本章以后的部分中谈论这些)
5 {6 {! b+ J! ~( m
2 H. _. C# D8 d" [5 d& W: @9 W
4 i$ f* D- Z8 c& d. e
, N! \! B1 g0 b8 h下一种类型的命令是函数.这是一种当解释器运行时存在于内存中的被命名的一块PowerShell脚本代码.
6 m f6 U! m% W从出口处退出.(在第七篇中有详细的信息来介绍怎么把函数载入进环境中).函数是定义一次后,就能被解析的用户自定义代码.这些语法表达式被保留了,所以不需要每次使用时都进行分析.函数可以像cmdlets一样被命名为参数,但是在PowerShell的第一个版本中,没有完备的参数说明能力.在清单2.2,第四行中的这段脚本是从进程关键字开始的,符合在清单2.1中的程序记录方法.这允许函数和cmdlets拥有同样的流行为.(在本篇2.3.1中有关于流的更详细的信息).
1 o ^4 X0 N4 G. Q清单2.2- u* V8 N/ v! O9 Q5 H$ d# X
function Write-InputObject
* w% u0 w! R! U8 ^ {( z{' z0 _0 ?) Q. Y& c& P K& G3 z
param($Parameter1)- i1 _; O) H! a0 M% u
process {9 e- B5 u: i3 `# Q9 _# K3 t. \3 s
if ($Parameter1): `; Z) E! P9 e M0 I' o; |- a
{
) ]8 X4 e+ K$ Z "$Parameter1:$_"+ N2 e$ _5 o7 B, V& g" n$ J' W
} else {
! X, v3 B) m- J* x' ^3 k. F "$_"+ Q8 |7 e( y6 O8 u2 i, e' H9 R9 Q5 u
}
3 v+ C- w% W& l1 R+ ]0 ~}
& X3 D* H6 H6 `一种脚本命令也是一块PowerShell的代码存在于有一个.ps1扩展名的文件中.在PoweShell 1.0版本中,这些脚本文件在他们运行时重新载入和解析,所以他们总是比函数运行时慢一些.在术语中,parameter capabilities,shell function commands,script commands是一致的.! ]7 e! ?% j; ?! u
最后一种命令被称为本地命令,这些扩展程序(也是经典的可执行文件)可以在操作系统中执行.
( ^# ] [6 n2 k0 X作者笔记:为这种事选择名称是困难的事,本地命令的术语多少听起来有点怪.我们原来把扩展命
: S. f4 s3 a% a" d. x2 U令称为"继承命令",然而,继承所回馈的更感觉成了否定术语.另一方面,简单的把他们称为可执行文件真得不很适合,因为这类文件也包括了cmd.exe文件,批处理文件.最后,我们还是觉得本地命令有充分的特色.: A7 x' T& H8 j! Q0 H. u
运行了本地命令之后,就意味着该命令建立了整的新的进程,本地命令是最缓慢的命令类型。
3 d6 `$ a6 B ]5 F
$ ?7 ^9 N3 ?# ]: Q, ?+ q4 `同时,本地命令用他们自己的参数进程而不用比较其它类型的语法。当然,本地命令覆盖了在windows计算机上能运行的任何事,所有,有广阔多样的行为。有个最大的问题是:PowerShell在等待命令结束前它保持着运行。举个例子,在命令行下开始一个文本文档。
$ O- f. V/ _$ ^3 DPS (1) > .\foo.txt* O5 M( f2 N. A' L( i+ l4 C
PS (2) >
. ?+ K% x) R9 X8 w- g你很快能得到命令行的回馈,你默认的文本编辑器弹出来了(或者默认是notepad.exe)。运行的程序被作为windows环境的一部分而被定义的文件关联决定。* o) H# r- s r6 [0 t
笔记:在PowerShell中,和cmd.exe不同,如果不在当前路径中,你需要一个./或.\的前置命令。这是PowerShell的“安全设计”哲学的一部分。这一条安全特性被采用以阻止特洛伊木马攻击,当用户被引诱进一个目录然后运行像notepad.exe之类无害的命令。它可以替代直接运行系统中的notepad.exe,它阻止攻击者放在路径中的被命名为notepad.exe的恶意程序运行。在第13篇中,覆盖了PowerShell环境中的详细的安全特性。
1 G: V- G% |2 c0 T& ~) K所以你怎么详细清楚的说明编辑器呢?$ r& P/ s5 h g: V
PS (2) > notepad foo.txt
$ E2 O) w, a. UPS (3) >$ g8 X/ F5 y7 }1 d; M
同样的事发生了----命令迅速的返回了。但是你在管道行中运行命令的过程中会发生什么呢?
; w. |- D+ S$ ^0 Z0 q' H# d/ cPS (3) > notepad foo.txt | sort4 ]6 e# R3 n7 {1 {' o# `
<exit notepad>
! o" K f) z1 U8 r5 d9 I4 cPS (4) >
9 s T. ^! y- w G4 ]+ B现在,PowerShell在提示符返回前等待着命令退出。这可以为你在编辑器的脚本中作一些进程来插入一些图片提供便利。
1 s# @5 X7 M3 V6 w7 j" `最后,让我们运行edit.com程序。这是一种windows自带的从DOS 4.0后出现的基于古老控制台的全屏编辑器(当然,它也在其它的控制台编辑器处工作--vi,emacs......)- y$ p2 h, s( s- q; W2 x, ^3 X
PS (6) > edit.com ./foo.txt
2 f0 W$ s+ n- y0 l8 W$ {PS (7) >, H2 d/ t M- g/ u
和你期待的一样,编辑器运行了,接管了控制台窗口。你可以编辑文件然后退出编辑器返回PowerShell,这样,一切正常和合乎期待。你能看到,本地命令的行为依赖于本地命令的类型,和管道行一起出现。
. }. J0 M F0 B6 D1 G8 D现在让我们来看所有的PowerShell命令类型,让我们再返回PowrShell语法。
- v! c( M- V) |! V2.1.3 别名和有弹性的语法! E. i; [, p4 n" }$ T
我们还没有真的谈论过别名也没有谈过他们是怎样在PowerShell中完成有弹性的语法的。这个内容在PowerShell环境中很重要,我们需要为这花费一段时间。( T1 k% C- z+ }# F2 e6 o, U
cmdlet的动名词语法,既规则,也冗长。同时你也可以注意到,我们用的更多的例子既像dir也像type.
# N* e2 ^) M) m& N& j5 U别名是一种隐藏所有这些的诡计。dir命令是get-childitem,type是get-content.实际上,你可以用get-command命令来看这些。
; f, w1 P( d1 Z/ E$ NPS (1) > get-command dir
) ^6 a2 v# i" I9 Q. l" U' zCommandType Name Definition
3 e4 ~# L, l# R8 J6 s( N% s8 j----------- ---- ----------
; ]* S6 `0 q# I) W9 r) _+ k; rAlias dir Get-ChildItem
5 }3 b, V% L3 J' ^- {上面告诉你get-childitem的别名。想得到get-childitem命令的信息,你可以用:
: c: ]. S5 F5 X4 p& T8 XPS (2) > get-command get-childitem
! r/ e/ q9 z4 o/ S9 |5 Q% GCommandType Name Definition
* C( [8 Z3 O+ C1 ~----------- ---- ----------, x: p( P6 D0 y$ k. Q# o
Cmdlet Get-ChildItem Get-ChildItem [[-P...
0 N4 D' g: @; J; L可以截断控制台窗口的宽度信息。为了观看所有的信息,可以从管道输出get-command到fl:% M$ C u4 z( G: [
PS (3) > get-command get-childitem | fl
6 q% G* S- t8 l/ B t4 g" b; Z! lName : Get-ChildItem* |, A" v9 S8 q+ j
CommandType : Cmdlet h6 Y/ z! L/ x, `. J
Definition : Get-ChildItem [[-Path] <String[]>] [[-Filter]
# v0 I9 `( V, l' J8 B9 d <String>] [-Include <String[]>] [-Exclude <S
5 X! E8 r% S C tring[]>] [-Recurse] [-Force] [-Name] [-Verbo3 q0 r6 _7 t# @- C
se] [-Debug] [-ErrorAction <ActionPreference>2 b: d1 D/ P N1 |5 P1 v2 f
] [-ErrorVariable <String>] [-OutVariable <St
) u5 u( W5 _1 u5 }3 h ring>] [-OutBuffer <Int32>]/ O; V6 U# k3 }4 M. b& [! E
Get-ChildItem [-LiteralPath] <String[]> [[-Fi
: B) [1 j3 X/ y lter] <String>] [-Include <String[]>] [-Exclu- e% h0 j- v$ r) G( t, P, f
de <String[]>] [-Recurse] [-Force] [-Name] [-
4 Y8 @- N0 V7 g; T% _ Verbose] [-Debug] [-ErrorAction <ActionPrefer& r/ g6 c/ R/ q9 A- I/ A
ence>] [-ErrorVariable <String>] [-OutVariabl- w% O2 E& P/ B7 `/ {
e <String>] [-OutBuffer <Int32>]
* A8 {, }1 \" n6 }- kPath :+ _2 y8 G% i8 a& `1 \ k
AssemblyInfo :+ I% F! f/ F0 U& U3 }4 n& }4 B
DLL : C:\WINDOWS\assembly\GAC_MSIL\Microsoft.PowerS
, B) P* L! L5 h* N& C- S8 \) \* u hell.Commands.Management\1.0.0.0__31bf3856ad3
# L4 o. |, ]) s- s 64e35\Microsoft.PowerShell.Commands.Managemen
: u+ `! R8 J7 ]9 U/ x1 [" i t.dll+ f" `# z* e% ]- B7 v4 i+ W
HelpFile : Microsoft.PowerShell.Commands.Management.dll-, |8 s7 P# i5 L/ e) I% m& _2 i
Help.xml$ s4 q: C, M( r& U) \. E
ParameterSets : {Items, LiteralItems}3 ~7 }. I( M: J% }* a
ImplementingType : Microsoft.PowerShell.Commands.GetChildItemCom
+ V" U4 |. ^! `6 |8 [2 z4 D mand
. t9 w+ s* t: [# H+ Z- U; r4 xVerb : Get4 D! e! U+ T5 E
Noun : ChildItem
4 `/ F( L! C, u+ }, M: w/ w& U1 W, b这些展示给你这个cmdlet的全部的信息。但是----什么是fl 命令?再一次我们用get-command来看它:
* s0 ?0 _& W9 E7 ~% D" _PS (4) > get-command fl0 |6 }, o. N# x
CommandType Name Definition; @8 Y9 C4 J7 Z) |5 ]
----------- ---- ----------1 G! @$ B" T. t# z2 [
Alias fl Format-List
- U7 l5 c& b; K, JPowerShell带来了大量的预先设置的别名。有两种基本类型的别名---过渡的别名和方便的别名。过渡的别名意味着一种把PowerShell命令映射到人们使用其它shell时的命令,特殊的像cmd.exe和unix shells.
$ h# y9 }8 i) i. {& I在cmd.exe用户中,PowerShell定义了dir,type,copy,之类的命令。在UNIX用户中,PowerShell定义了ls,cat,cp之类的命令。这些别名充许新的用户立刻使用基本等级的函数。
9 F. H: c' k. j) E# H9 ~% a另一种别名被称为方便的别名。
) r% O( `( v4 n2 Q这些别名起源于cmdlets要映射的名称。所以get-command可写为gcm,get-childitem成了gci,invoke-item变成了ii,很多很多。在被定义的别名清单中,只在命令行中输入get-alias。你可以使用set-alias command(这是设置别名的方法)来定义自己的别名。
* x) x9 f0 a [( d% {$ V作者的笔记:在PowerShell的第一个版本中,别名只被限制成别名命令名。不像别的系统如同ksh,bash,zsh,PowerShell别名不能代表参数。计划在下一个发行版中补充进这项功能。在第一个版本中,如果你想作一些比翻译简单的命令名更机智的活,你将不得不使用shell函数或者脚本。
: d3 h* [# R' ~" R. U0 Y7 H这又好又棒,但是为什么这么有弹性呢?欢迎问这个问题!这个概念中,PowerShell可以在需要时和描述时适当的变得简洁一些。这个语法可以作简洁的简单案例也可以被伸展作得像一个有弹性的带子这类大的难题。(笔记:也许是指以简洁的语言为基础,完成难题吧)这在PowerShell中很重要特别是命令行工具和在脚本语言中。在巨大多数的“脚本”中。你们将要用PowerShell完成不超过太多行长度的脚本。换句话说,在命令行下输入后,他们将要成为一个字符串或命令,然后,输入部分就不需要再出现了。受这个因素影响,在这个环境中,语法变得更简洁。这是别名中,像fl一样的来历---他们充许你写简洁的命令行。在写脚本的时候,无论如何,最好还是使用命令的长文件名。这是因为不久或已后,你将不得不面对你自己写的脚本(或者一些其它错误的东西)。你能看懂像下面的这些东西吗?. }4 g4 ?1 d9 a4 f' n
gcm|?{$_.parametersets.Count -gt 3}|fl name4 U ~5 I+ p4 Q7 x/ X
或者这个?' b* V1 o6 }! O1 s
get-command |
& M0 b& I6 E! ]! bwhere-object {$_.parametersets.count -gt 3} |
) F8 Q/ u3 K5 t7 ~; `6 eformat-list name
3 j- {% T; y1 R9 q/ ^8 B作者笔记:PowerShell中很多命令各自有两个或更多的的名字。一些人认为这并不牢靠----他们提出只要有一种方法来作这事就行了。实际上,只有一个方法达成目标这个原理在PowerShell中也是正确的,只是有一个重要的变更:我们想要在每一个场景或形势中得到一个最好的方法作事情。作为基础,这是计算机谈论时很常见;最简小的,所有的一切都只是一串的比特。实际上,你从单比特到建立起了合适的,符合自已需要的解决方案。沿着这种方法,你建立了一个可以重用来解决其它难题的中等大小的组件.这适合PowerShell的应用:这一组件系列有不同的复杂等级来规划一个广阔范围的类.举个例子,难题中并不总是钉子,所以使用更多的工具而不仅是锤子就是个好主意,即使需要进行更多的学习,我们还要使用除锤子之外的工具.: N( I" R8 r* U: E
7 m, ~7 m: g* b# H9 z f u0 L+ t现在我们谈到了命令在进程中工作的核心,下一步,让我们全方位的来看一下PowerShell语言进程.
1 [6 [7 D$ f9 C: I) B* }7 q8 S% p1 N6 [$ }3 @+ ?8 B
[ 本帖最后由 kenknigh 于 2007-5-30 20:45 编辑 ]
附件: 您所在的用户组无法下载或查看附件