Windows PowerShell简介

http://os.51cto.com/art/201101/244056.htm

PowerShell与Unix Shell对比:八大实例

2011-01-26 09:28 付海军 e800技术客 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

本文将从八个实例对比PowerShell和Unix Shell,通常是Linux Bourne Shell(包括sh、ksh和bash等)。二者存在非常大的差异,最大不同是PowerShell将对象作为基本的操作单元,而Unix Shell将字符串作为基本单元。相似之处是二者均有数量巨大内置命令,而且允许用户扩展。

AD:

 

本文将举例对比PowerShell和Unix Shell,通常是Linux Bourne Shell(包括sh、ksh和bash等)。二者存在非常大的差异,最大不同是PowerShell将对象作为基本的操作单元,而Unix Shell将字符串作为基本单元;相似之处是二者均有数量巨大内置命令,而且允许用户扩展。

1 实例:终止进程

在Unix操作系统中为了终止所有以字母“p”开头的进程,需要在命令行中运行下面的命令:

$ ps -e | grep " p" | awk '{ print $1 }' | xargs kill

通过ps命令获取了当前进程的清单并将获取的文本输出到grep命令中,该命令搜索文件名以“p”开头的进程。将输出发送给awk命令,从中选取第1列(这里是进程的ID)并输出给xargs命令;xargs命令会对每个进程执行kill命令,从而终止所有以“p”开头的进程。尽管实现了功能,但是整个命令却不可靠。因为ps命令的执行效果在不同操作系统中不同(甚至在相同的操作系统的不同版本中执行也会有差异)。如果不支持-e选项的ps在执行时包含进程ID的列,则不一定是第1列,此时命令行的执行会出现问题。

类似地,如果要在PowerShell中执行相同的命令,只需要执行下面的操作:

PS C:\> get-process p* | stop-process

这里的命令查找所有以“p”开头的进程,并将其终止。Get-Process cmdlet带的参数是需要匹配的进程名,得到的结果对象被直接传递给Stop-Process cmdlet,这样即可结束对应的对象进程。

2  实例:结束过滤的进程

为查找并杀死占用内存超过10 MB的进程,在Unix命令行下需要执行如下命令:

$ ps -el | awk '{ if ( $6 > (1024*10)) { print $3 } }' |
grep -v PID | xargs kill

此命令的执行成功取决于用户已知道ps –el命令将会在第6列中返回进程占用的内存大小(以KB为单位)并且在第3列中包含PID属性,同时需要去掉ps命令输出的第1行。

接下来查看在PowerShell中对应的脚本:

PS C:\> get-process | where { $_.WS -gt 10MB } | stop-process

可以看到基于对象的命令相比基于文字的命令的好处,即不必关心包含进程占用内存大小或包含进程ID的部分所在的列。内存占用量能够通过进程名称引用,Where cmdlet可检查输入的对象并取得对象的属性。

3  实例:计算目录大小

在这个实例中将计算某个目录中包含文件的大小,遍历文件、获取其长度属性并叠加到一个变量中,最后打印变量。在Unix系统中的处理方式如下:

$ tot=0; for file in $( ls )
> do
> set -- $( ls -log $file )
> echo $3
> (( tot = $tot + $3 ))
> done; echo $tot

上例使用set命令为每个空格分隔的元素创建变量,这是在awk命令出现之前通常使用的Unix命令。如果使用了awk命令,将会减少相当的代码量,如下所示:

$ ls –l | awk ‘{ tot += $5; print tot; }’ | tail -1

这样降低了命令的复杂性,但是需要用户知道其中的长度属性是在第5列,不同版本的awk可能会有差异。在PowerShell中的循环也很简单,虽然也需要逐个遍历,但是获取长度属性很方便。因为长度作为文件对象的属性存在,不需要关心其所在列,相似的脚本如下:

PS C:\> get-childitem | measure-object -Property length -Sum
Count    : 53
Average  :
Sum      : 489648208
Maximum  :
Minimum  :
Property : length

其中使用的Measure-Object cmdlet将根据输入的-Property确定要操作的属性,根据输入的选项,如-Sum、-Maximum、-Minimum和-Average对前面指定的对象属性做求和、求最大值、求最小值,以及求平均值。这里为了和前面的Unix脚本相匹配,只需要指定Length属性及-Sum选项即可。

4  实例:操作动态值

很多由系统提供的对象通常是动态,而不是静态的。即获取某个对象后不需要稍后再次获取其数据,因为该数据根据系统条件的改变不断更新。并且修改这些对象也会立即在系统中生效,此类对象称之为“实时对象”。

例如,需要获取处理器处理时间的占用情况,传统Unix Shell中的ps命令会反复运行以不断取得进程的运行状况。对于能够访问实时进程的对象,只需要获取处理对象一次。一旦对象被系统更新,只需要持续重新读取相同的属性即可。下例以10秒为间隔获取应用程序占用的内存大小,首先查看Unix Shell脚本的处理方式:

 

$ while [ true ]
do
msize1=$(ps -el|grep application|grep -v grep|awk '{ print $6}')
sleep 10
msize2=$(ps -el|grep application|grep -v grep|awk '{print $6}')
expr $msize2 - $msize1
msize1=$msize2
done

 

使用PowerShell操作的方式如下:

PS C:\>> $app = get-process applicationName
PS C:\>> while ( $true ) {
>> $msize1 = $app.VM
>> start-sleep 10
>> $app.VM - $msize1
>> }

显然,PowerShell的脚本更加简单易读。

5  实例:监视进程寿命

如果在Unix下确定特定的进程是否继续在运行,则需要收集进程清单并与另外一个清单对比。例如:

$ processToWatch=$( ps -e | grep application | awk '{ print $1 }'
$ while [ true ]
> do
> sleep 10
> processToCheck=$(ps -e |grep application |awk '{print $1}' )
> if [ -z "$processToCheck" -or \
> "$processToWatch" != "$processToCheck" ]
> then
> echo "Process application is not running"
> return
> fi
> done

而在PowerShell下只需要执行下面的操作:

PS C:\> $processToWatch = get-process applicationName
PS C:\> $processToWatch.WaitForExit()

能够看到PowerShell只需获取对象并等待对象退出即可提示。

6  实例:确定软件是否存在预发布的测试版

由于预发布的测试版本往往不稳定,可能存在各种缺陷。从而导致系统安全风险,所以有必要区分此类软件。Unix可执行文件中并不保存此类信息,所以不必讨论Unix Shell下的情况。对于Windows来说,需要特定的工具检查当前运行的进程中是否存在预发布的测试版本。例如:

PS C:\> Get-Process | where  {
>> $_.mainmodule.FileVersioninfo.isPreRelease}
>> 
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    627      17    29236       5120   177     7.66    560 Powerword

这个实例使用了层叠的属性,从进程对象(MainModule)中获取的属性中检查。FileVersionInfo属性是MainModle的引用,其属性IsPreRelease是确定软件是否为预发布版本的根据。如果该属性为真,则Get-Process cmdlet输出的对象将会被输出到控制台。

7  实例: 转换字符串大小写

在Unix Shell中通常会用下面的方式转换特定字符串的大小写:

$ echo "this is a string" | tr [:lower:] [:upper:]

或者使用:

$ echo "this is a string" | tr '[a-z]' '[A.Z]'

在PowerShell中则更为简便,如:

PS (1) > "this is a string".ToUpper()

这是直接使用字符串对象的ToUpper()方法转换将字符串中的大写字母转换为小写字母。如果需要将大写字母转换为小写字母,则使用ToLower()方法即可。

8  实例:在字符串中插入字符

例如,需要将字符串“ABC”插入到字符串“string”的首字母之后,得到类似“sABCtring”的字符串。在Unix Shell下使用sed命令:

$ echo "string" | sed "s|\(.\)\(.*)|\1ABC\2|"

在PowerShell中则使用正则表达式:

PS (1) > "string" -replace '(.)(.*)','$1ABC$2'
sABCtring

在PowerShell中更简单的方法是对字符串对象使用Insert()方法直接完成插入操作,如:

PS (2) > "string".Insert(1,"ABC")
sABCtring

【编辑推荐】

 

http://os.51cto.com/art/201101/244228.htm

有关PowerShell脚本你必须知道的十个基本概念

2011-01-28 15:11 黄永兵 译 51CTO.com 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

相对于传统的命令行工具,PowerShell对很多用户来说都会显得非常陌生。PowerShell脚本提供了一个方便的方法来自动化各种琐事。本文介绍了关于PowerShell的一些基本概念,对于PowerShell初学者,掌握这些概念有助于加深对PowerShell脚本的理解。

AD:

 

【51CTO精选译文】PowerShell脚本提供了一个方便的方法来自动化各种琐事。下面是关于PowerShell的一些基本概念,对于PowerShell初学者,掌握这些概念有助于加深对PowerShell脚本的理解。

51CTO推荐专题:Windows中的脚本技术-Windows Powershell

1、PS1文件

一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要使用.PS1扩展。

2、执行权限

为防止恶意脚本的执行,PowerShell有一个执行策略,默认情况下,这个执行策略被设为受限的(Restricted),意味着PowerShell脚本无法执行,你可以使用下面的cmdlet命令确定当前的执行策略:

Get-ExecutionPolicy

你可以选择使用的执行策略有:

  1. Restricted - 脚本不能运行。
  2. RemoteSigned - 本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)。
  3. AllSigned – 仅当脚本由受信任的发布者签名才能运行。
  4. Unrestricted – 脚本执行不受限制,不管来自哪里,也不管它们是否有签名。

你可以使用下面的cmdlet命令设置PowerShell的执行策略:

Set-ExecutionPolicy <policy name>

3、运行脚本

如果你想从命令行运行一个可执行文件,多年来一个永恒不变的方法是,在命令行转到该执行文件所在的位置,然后键入该执行文件的名称,但这个古老的方法现在却不能适用于PowerShell可执行脚本了。

如果你想执行一个PowerShell脚本,通常必须键入完整的路径和文件名,例如,假设你要运行一个名为SCRIPT.PS1的脚本,你可以键入:

C:\Scripts\Script.ps1

最大的例外是,如果PowerShell脚本文件刚好位于你的系统目录中,那么你可以直接在命令提示符后键入脚本文件名即可运行,如:

.\Script.ps1

注意前面需要加上.\,这和Linux下执行Shell脚本的方法如出一辙。

4、管道

管道的作用是将一个命令的输出作为另一个命令的输入,两个命令(或cmdlet)之间只需要用管道符号(|)连接即可。

为了帮助你了解管道是如何工作的,我们以一个例子进行说明,假设你想创建运行在服务器上的进程列表,并按进程的ID号进行排序,可以使用Get-Process cmdlet命令获得进程列表,但默认情况下列表不会排序,如果将这个cmdlet命令的输出用管道输送给Sort-Object ID命令,进程列表将会按进程ID号进行排序,如:

Get-Process | Sort-Object ID

5、变量

虽然可以使用管道将一个命令的输出输送给另一个命令,但管道本身也是有限制的,当你用管道从一个命令向另一个命令传递输出结果时,输出结果立即被使用,但有时候,你可能需要保存输出结果一段时间,以便以后可以使用(或重用),这个时候管道就应该下场,轮到变量上场了。

人们很容易将变量想象成一个仓库,但在PowerShell中,变量可以保存命令的完整输出,例如,假设你想保存服务器处于运行中的进程列表,你可以将它赋给一个变量,如:

$a = Get-Process

在这里,变量被命名为$a,如果你想使用这个变量,只需要简单地调用它的名称即可,例如,键入$a便可在屏幕上打印变量的内容。

你可以将多个用管道连接的命令的最终输出赋给一个变量,只需要用一对小括号将命令括起来即可,例如,假设你想按进程ID对运行中的进程进行排序,然后将结果输出给一个变量,你可以使用下面这个命令:

$a = (Get-Process | Sort-Object ID)

6、@符号

通过使用@符号,你可以将列表内容转换成一个数组,例如,下面的代码创建了一个名为$Procs的变量,它包含多行文本内容(一个数组):

$procs = @{name="explorer","svchost"}

使用变量时你也可以使用@符号,为了确保它作为数组而不是单个值处理,例如,下面的代码将在我前面定义的变量上运行Get-Process cmdlet命令:

Get-Process @procs

Windows将显示Windows资源管理器和Svchost使用的所有进程,注意变量前使用的@符号,而不是常见的$符号。

7、Split

Split操作符根据你指定的字符拆分一个文本字符串,例如,假设你想将一个句子拆分成一个单词组成的一个数组,你可以使用下面的命令做到:

"This is a test" -split " "

拆分后的结果如下:

This is a test

8、Join

就像Split可以将一个文本字符串拆分成多块一样,Join的操作则是逆向的,将多个独立的块连接成一个整体,例如,下面这行代码将会创建一个文本字符串,由我的名字和姓氏组成:

"Brien","Posey" -join " "

命令末尾双引号之间的空格告诉Windows在两个文本字符串之间插入一个空格。

9、断点

运行一个新创建的PowerShell脚本时,如果脚本有Bug,会遇到意想不到的后果,保护自己的一个方法是在脚本的关键位置插入断点,这样你就可以确保脚本正常运行先,然后再处理可能存在的问题。

插入断点最简单的方法是根据行号插入,例如,假设你要在第10行插入一个断点,可以使用下面的命令:

New-PSBreakpoint -Script C:\Scripts\Script.ps1 -Line 10

你也可以将断点绑定到变量上,如果你希望你的脚本任何时候都可以修改a$的内容,可以使用下面的命令:

New-PSBreakpoint -Script C:\scripts\Script.ps1 -variables a

注意,我在变量名后并没有包括美元符号。

可以和PSBreakpoint一起使用的动词包括New,Get,Enable,Disable和Remove。

10、Step

调试一个脚本时,有时可能需要逐行运行脚本,这时你可以使用Step-Into cmdlet命令,它会使脚本一行一行地执行,不管有没有设置断点,如果你想从这种步进式运行模式退出来,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令后,断点仍然有效。

顺便说一句,如果你的脚本使用了函数,你可能对Step-Out cmdlet更感兴趣,Step-Out的工作方式和Step-Into一样,不过,如果调用了一个函数,Windows不会逐步执行,整个函数将会一次性执行。 

 

【51CTO.com译文,转载请注明原文作译者和出处。】

 

原文:10 fundamental concepts for PowerShell scripting

 

http://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx

http://www.cnblogs.com/shanyou/archive/2007/02/12/648204.html

易学易用的Windows PowerShell

 

 

Windows PowerShell 是微软为 Windows 环境所开发的 shell 及脚本语言技术,这项全新的技术提供了丰富的控制与自动化的系统管理能力;而“脚本语言”(scripting languages)则是用来编写程序的计算机语言。脚本语言通常都有简单、易学、易用的特性,目的就是希望能让写程序的人(开发者)快速完成程序的编写工作。本文将简述脚本语言的起源与目的,并且介绍 Windows PowerShell。 
脚本语言的源起与目的

脚本语言是计算机程序语言(programming languages)的一种,因此也能让开发者藉以编写出让计算机听命行事的程序。但是「以简单的方式快速完成某些复杂的事情」通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比 C、C++ 或 Java 之类的「系统程序语言」(system programming languages)「简单」、「容易」,也让脚本语言另有一些所谓「脚本语言的特性」: •

语法和结构通常比较简单 •

学习和使用通常比较简单 •

通常以容易修改程序的「直译」作为执行方式,而不需要编译 •

程序的开发产能优于执行效能

脚本语言源自早期文字模式的命令列计算机系统,在当时只能以键盘敲入命令才能操作计算机的情况下,为了减少某些需要不断重复敲入命令的情况,计算机操作系统的命令处理器(在 UNIX 的世界这通常称为 command shell)提供了「批次操作」(batch operation)的方式,让计算机操作者可以将一整个流程的命令,循序、逐行的编排在称为「批处理」(batch file,也称为 batch jobs 或 shell scripts)的文字文件,若有相同的操作需要处理,即可加载批次档而不需再次重复敲入指令。

Shell Script

由于批处理对命令列的计算机系统操作者帮助甚大,因此操作系统的命令处理器也不断加强功能,尤其加入了许多程序语言的重要元素,包括变量、循环、条件判断等等,让计算机操作不只是循序的执行命令,而能更精确的操控计算机系统的运作;这种程序设计通常称为 shell programming。因此,不论是大型主机的系统操作员,或者是整个计算机环境的系统管理员、网络管理员,shell programming 都是相当重要的技能,这项技能可以有效且快速的管理辖下的计算机。

UNIX 系统的 shell 相当多样,例如 Bourne Shell(sh)、Bourne-Again Shell(bash)、Korn Shell(ksh)、C Shell(csh)等等;以下简述常见的 UNIXshell。 •

Bourne Shell(sh):这是历史悠久且重要的 UNIX shell,是由贝尔实验室的研究员 Stephen Bourne 为第七版的 UNIX 所创造,这种 shell 的执行档扩展名就是 .sh。 •

Bourne-Again Shell(bash):光从名称就能猜出 bash 与 sh 是有渊源(甚至说「血缘」)。bash 是由 Brian Fox 于 1987 年为 GNU 所创造,1990 年起,Chet Ramey 成为主要的维护者。bash 是相当流行的 shell,除了是大多数 Linux 预设的 shell,在许多 UNIX-like 系统也有其踪迹(例如 Mac OS X Tiger),甚至也能通过 Cygwin 在 Windows 系统执行。

Korn Shell(ksh):是由贝尔实验室的研究员 David Korn 在 80 年代初期所创造,ksh 除了与 sh 完全兼容,也包含了若干 C Shell 的功能。

C Shell(csh):是由 Bill Joy(后来创办了Sun公司)为 BSD UNIX 系统所创造。csh 源自于第六版 UNIX 的 Thompson shell(是 Bourne Shell 的前身),因为语法类似 C 语言而得名。

除了上述盛行于 UNIX 环境的 shell,其它操作系统也有专属的 shell 或 shell 脚本语言,例如苹果Mac系统的 AppleScript、IBM OS/2 的 REXX(REstructured eXtended eXecutor)。而 DOS 以及早期 Windows 的 shell 则是 Command.com,但也因功能较弱,因此有 4DOS、4NT 等软件可增强功能,Windows 2000 以及之后的 Windows 则改以功能较强 cmd.exe 作为 Windows shell,并且以 Windows Script Host 作为脚本语言执行环境,大幅提高了 Windows shell 的可用性。而微软也将会推出功能更强的 Windows shell,称为 Windows PowerShell。

虽然现在许多计算机系统都提供了图形化的操作方式,但是却都没有因而停止提供文字模式的命令列操作方式,相反的,许多系统反而更加强这部份的功能,例如 Windows 就不只加强了操作命令的功能和数量,也一直在改善 shell programming 的方式。而之所以要加强、改善,当然是因为不够好;Windows 的图形化操作方式对单一客户端计算机的操作,已经相当方便,但如果是一群客户端计算机,或者是 24 小时运作的服务器计算机,图形化操作方式有时会很不方便。

 

宏语言

宏语言也可视为脚本语言的分支,两者也实质上的相同之处。宏语言通常附属于某一种软件,例如微软 Office、Visual Studio、Adobe Photoshop 都内建了宏语言的功能,使用者可利用软件所附的宏语言,达到自动化的结果(例如调整某个数据夹所有 PSD 图文件的分辨率)。而这类宏语言也大多提供录制宏的功能,自动记录使用者的键盘按键,让使用者不必写程序,就能产生宏程序。此外,C 语言和汇编语言也有宏功能,是以搜寻及取代进行编译或组译之前的前置处理。

Windows PowerShell 诞生

UNIX 的世界有功能强大的 shell,现在 Windows 环境也有了;Windows PowerShell 不仅提供功能相当于BASH的命令列 shell,同时也内建脚本语言以及辅助脚本程序的工具。Windows PowerShell 是以 .NET 技术为基础,并且与现有的 WSH 保持回溯兼容,因此 Windows PowerShell 的脚本程序不仅能存取 .NET CLR,也能使用现有的 COM 技术。

Windows PowerShell 包含了数种系统管理工具、简易且一致的语法,提升管理者处理常见如登录数据库、WMI。Exchange Server 2007 以及 System Center Operations Manager 2007 等服务器软件都将内建 Windows PowerShell。

Monad 是 Windows PowerShell 之前的项目代号,Microsoft Shell(MSH)则是另一个别名;简而言之,Windows PowerShell 具有以下特点:

一致性的设计让所有工具和系统数据的使用语法、命名原则都相同。

Windows PowerShell 的脚本语言不仅简单易学,而且能支持现有的脚本程序和命令列工具。 •

内含 129 种称为 cmdlet 的标准工具,可用来处理常见的系统管理工作,例如登录数据库、系统服务、形成、WMI、事件日志等等。 •

具备完整的扩充功能,独立软件商或开发者都能很容易的自行扩充。

下载、安装、执行 Windows PowerShell

Windows PowerShell 可安装于 Windows XP 以及之后的客户端或服务器端 Windows 操作系统,包括: •

客户端:Windows XP、Windows XP Service Pack 1、Windows XP Service Pack 2、Windows Vista •

服务端:Windows Server 2003、Windows Server 2003 R2、Windows Server 2003 Service Pack 1

而 Windows PowerShell 除了有 32 位版本,也还有 x64 和 ia64 等两个 64 位版本,可以安装在这两种 64 位 Windows 平台。此外,由于执行 Windows PowerShell 需要 .NET Framework 2.0,因此请先替计算机安装 .NET Framework 2.0。

安装之后,可以利用以下三种方式执行 Windows PowerShell:

位于『开始 / 所有程序』的『Windows PowerShell』快捷方式。

在『开始 / 运行』的『运行』命令窗输入 powershell。

在任何『命令提示字符』窗口的命令提示符号输入 powershell。

Windows PowerShell 窗口看起来类似原本的『命令提示字符』窗口,而我通常也都会调整窗口和字型的大小,以方便作业。

 

初探 Windows PowerShell

任何 shell 都有列出目录、文件的命令,Windows PowerShell 呢?先输入 DOS 的 dir 试试吧!

圖 1 dir 指令執行結果
图 1 dir 指令执行结果

嗯!dir 果然也通,但是列示的方式不同于以往的 dir 指令。一时兴起,我输入了 UNIX 的 ls 指令,窗口显示了与 dir 指令相同的结果;真有趣(这时候我尚未阅读任何 Windows PowerShell 文件,只是很直觉输入指令)。

 

Windows PowerShell 指令

cmdlet 是 Windows PowerShell 的指令,这相当于 DOS 或其它 shell 的内建指令(但是刚刚输入的 dir 或 ls 并不是 cmdlet,这稍后将会说明),cmdlet 的发音方式是 command-let。cmdlet 名称的格式都是以连字符号隔开的一对动词和名词,并且通常都是单数名词。例如可以在线查询 cmdlet 用法的 cmdlet 即为 get-help。cmdlet 名称的动词部分大致有 get、set、add、remove 等等(Windows PowerShell 的操作与 DOS 相同,输入的字母都不分大小写)。

get-help 是颇为重要的 cmdlet,可以在线查询所有的 Windows PowerShell 指令和说明文件。例如: •

get-help *:列出所有的主题,包括指令和概念。

get-help * | more:列出所有的主题,包括指令和概念,而且显示满整个窗口就暂停。

get-help about*:列出所有的概念主题,例如万元字符、foreach 循环。

get-help get*:列出所有 get 开头的主题。 •

get-help {<指令名称或主题名称>}:列出指定的指令或主题的说明,例如 get-help dir 可以查询 dir 指令的用法,而 get-help about_wildcard 可以查询「万用字符」这项主题的用法。

此外,也可以用 help 取代 get-help,最大的好处是 help 显示满整个窗口,预设就会自动暂停。

一开始曾经使用了 dir 和 ls,虽然这并不是 cmdlet,但的确可用于 Windows PowerShell。原来这类的指令称为 alias(化名),类似 cmdlet 的快捷方式,例如 dir 和 ls 实际上都是 get-ChildItem 的 alias,get-ChildItem 才是 cmdlet;而 get-ChildItem 的功能,是列出磁盘驱动器指定位置的子项目。

Windows PowerShell 的指令包含了许多内建的 alias,这些 alias 都是我们原本熟悉的 DOS 或 shell 指令,除了上述的 dir 和 ls,例如原本 DOS 指令的 rm、rmdir、rd、cls、copy 等,以及 BASH 的 cat、sleep、clear、cp 等,都是 Windows PowerShell 的 alias,也就是说,可以直接使用这些 alias;若要列出所有的 alias,可以用 get-alias 指令。除了使用内建的 alias,Windows PowerShell 也允许使用者以 set-alias 建立自己的 alias。

除了 cmdlet 和 alias,Windows PowerShell 的指令还有 Application 和 Function 两种类型,前者指的是独立的程序文件(在 DOS 时代称为外部指令),后者是有名称的程序代码区块,也就是函式:不论 Application 或 Function 都可以当作 Windows PowerShell 指令来用,也可以用在脚本程序里。利用 get-command *,可以列出所有的指令。

 

Windows PowerShell 的管线功能

DOS 或 UNIX shell 都能利用「管线符号」(pipeline symbol),将指令的执行结果移转到另一个指令,让另一个指令处理前一个指令转来的数据。Windows PowerShell 的管线符号也是 |,例如之前用过的 get-help * | more,就是将 get-help * 的结果转给 more,而 more 会让结果显示满整个窗口就暂停。

管线是各种 shell 环境的「黏合」最佳例证,例如管线就黏合了 Windows PowerShell 的各个指令,进而让各个指令完成一件工作。再举几个管线的例子。首先是:

ipconfig | findstr "Address"

被管线黏合的 ipconfig 和 findstr 都是 Win32 既有的外部指令,前者会显示、设定计算机的 IP 地址,后者则能以各种方式找出特定字符串。以上的叙述是将 ipconfig 的执行结果转给 findstr,并让 findstr 找出执行结果的 Address 字符串。

圖 2 ipconfig | findstr "Address"執行結果图 2 ipconfig | findstr "Address"执行结果

再举两个例子。以下的叙述会列出已停止的系统服务,但是由 get-service 和 where-object 相互协力完成,前者列出所有的系统服务,后者过滤出状态为 Stopped 的系统服务:

get-service | where-object {$_.Status -eq "Stopped"}

但以上叙述的结果会以系统服务的名称作为排列方式,若想以系统服务的「显示名称」依序排列,可以再加上 sort-object,并也以管线黏合:

get-service | where-object {$_.Status -eq "Stopped"} | sort-object -property DisplayName

圖 3 三重管線範例的執行結果
图 3 三重管线范例的执行结果

新的脚本语言

微软为 Windows PowerShell 创造了新的脚本语言,但若你熟悉任何一种脚本语言,你也能很快熟悉 Windows PowerShell 的脚本语言。基本上,只要将 Windows PowerShell 的指令放进扩展名为 .ps1 的文字文件,这个文件就是 Windows PowerShell 的脚本程序了。因此在熟悉了 Windows PowerShell 的命令操作之后,只要再熟悉 Windows PowerShell 脚本语言的变量、数组、循环控制、条件控制,大致上就语言的部分就差不多。但若要以脚本程序管理 Windows 系统,除了要熟悉脚本语言,当然也必须熟悉 Windows PowerShell 指令和 WMI,毕竟脚本语言的目的只是黏合这些现成的软件组件。

执行脚本程序还有几点注意事项,首先要确定脚本程序所在的位置是在执行路径里。再者,由于 Windows PowerShell 顾虑到安全性,预设是禁止计算机系统执行任何脚本程序,如果要解禁,必须利用 Set-ExecutionPolicy 指令。这个指令有三个参数:

set-executionpolicy allsigned:允许执行具有信任签章的脚本程序。 •

set-executionpolicy remotesigned:仅允许执行从远程下载且具有信任签章的脚本程序。 •

set-executionpolicy unrestricted:这是最宽松的条件,允许执行任何脚本程序,不管有没有信任签章。但自己编写的脚本程序通常都没有信任签章。

 

善用脚本语言

从近十年的程序语言发展趋势,能明显发现脚本语言的发展比系统程序语言更多样、更活络,开发者的接受程度也高。当然,这两种类型的程序语言,各有适用之处,没有谁取代谁的问题,而是如何选择适当的方法来完成工作。John K. Ousterhout(Tcl/Tk 的创造者)曾在 Scripting: Higher Level Programming for the 21st Century 一文提出他的看法,他认为脚本语言的主要目的,是在「黏合」(glue)现有的软件组件,而因为图形操作接口、因特网、组件应用框架(component frameworks)的崛起,需要有更多、更好的脚本语言来黏合(因此脚本语言也称为「黏合语言」(glue languages)或「系统整合语言」(system integration languages)。

当然,脚本语言本身能力的增进,以及计算机硬件的速度越来越快,也都是促进脚本语言蓬勃发展的原因。由于脚本语言大多采用直译的方式执行,因此执行效能会比利用编译的系统程序语言慢。不过当计算机硬件的速度越来越快,使用者就渐渐感觉不到脚本语言的速度较慢了。

简单、易学、易用的脚本语言尤其适合专责系统或网络管理的 IT 人员,因为脚本语言的起源就是为了便利系统操作,而且操作系统的供应者也都会加强这部份的功能,提供更简易的语法、更丰富的组件,让 IT 人员更易于「黏合」各项功能,而组合出绝对适合自身需要的脚本程序。

善用 Windows PowerShell

Windows PowerShell 将 Windows 环境各自分离的脚本语言(WSH)和操作指令重新紧密黏合,并且让 Windows 拥有与 UNIX 旗鼓相当的 shell 环境和脚本语言,在在都让 Windows 更适用于大型、复杂、重要的计算机运算环境。

当然 Windows PowerShell 的特色及优点尚不只本文所提,但只要依照本文,读者将能下载、安装并亲自尝试 Windows PowerShell 的功能,尤其 Windows PowerShell 将登录数据库视为磁盘驱动器来存取,实在非常适当,也非常简便,因为机码、机码值的结构,便如同目录、档案。在你下载、安装 Windows PowerShell 的同时,也别忘了下载官方相关文件,里面有最新的 Windows PowerShell 官方文件。

 

http://www.microsoft.com/taiwan/technet/columns/profwin/28-monad.mspx

参考数据及网络资源

下载 Windows PowerShell:
http://www.microsoft.com/technet/scriptcenter/topics/msh/download.mspx

TechNet Windows PowerShell Script Center:
http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

MSDN Windows PowerShell Blog:
http://blogs.msdn.com/powershell/

 
 
http://www.cnblogs.com/wenanry/archive/2009/12/18/1627375.html
 

回归Dos操作的快感,进入PowerShell世界

 

概述

写下本篇文章源于参加Tech.Ed的一场关于Window PowerShell的课程。虽然之前也经常关注,但从没有亲自体验过。Windows PowerShell 是一种新的命令行外壳和脚本语言,用于进行系统管理和自动化任务,它建立在 .NET Framework 的基础上,可使 IT 专业人员和开发人员控制和自动完成Windows 和应用程序的管理。更为强大之处在于它可以调用.NET Framework中的类库,可以与COM、ADO、XML等交互。在本文中让我们一起来体会一下回归Doc操作的快感,进入强大无比的Windows PowerShell世界。

在Windows PowerShell中包括了:

1. 129 个命令行工具(称为“cmdlet”),用于执行常见系统管理任务,如管理服务、进程、事件日志、证书、注册表以及使用 Windows Management Instrumentation (WMI)。

2. 采用标准命名约定和通用参数的命令行工具,易于掌握和使用;以及用于对数据和对象进行排序、筛选以及格式设置的简便工具。

3. 对现有脚本语言、现有命令行工具以及多种 Windows 版本的支持,其中包括 Windows XP、Windows Server 2003、Windows Vista 以及 Windows Server 2008。

4. 方便的功能,使用户能够浏览数据存储(如注册表和证书存储),就像面对文件系统一样。

5. 用于管理位于不同存储中以及采用不同格式的 Windows 数据的标准实用程序,这些数据包括 Active Directory (ADSI)、Windows Management Instrumentation (WMI)、组件对象模型 (COM) 对象、ActiveX 数据对象 (ADO)、HTML 和 XML。

6. 在命令行进行的高级表达式分析和 .NET 对象处理,其中包括对对象进行流水线处理以帮助提高 IT 专业人员的工作效率。

7. 可扩展的接口,使独立软件供应商和企业开发人员能够构建自定义 cmdlet 以满足特有的应用程序和系统管理要求。

简单示例

在开始之前,先来看一个简单的示例,在.NET中获取当前系统所有进程的一段代码:

static void Main(string[] args)
{
Process[] proceses = Process.GetProcesses();
foreach (var item in proceses)
{
Console.WriteLine(item.ProcessName);
}

Console.ReadLine();
}

非常简单的一段代码,直接获取所有进程并显示出它们的名称,如下图所示:

TerryLee_0203

在安装完Windows PowerShell之后,可以看到它的界面与常用的命令行界面非常相似。现在再使用Windows PowerShell来获取一下当前系统所有的进程,只有一个命令就可以完成:

Get-Process

输出如下图所示:

TerryLee_0204 

PowerShell命令

在Windows PowerShell中,内置了129个命令供我们使用,这些命令称之为“Cmdlet”。除了很多在Dos中的命令继续可以使用之外,还有PowerShell内置的一些命令。每个命令由两部分组成,前半部分表示动作,后半部分表示动作的标的,如Get-Help、Get-Command、Write-Host等。在Windows PowerShell中输入命令时,不需要输入全部名称,可以只输入其中几个关键字,PowerShell会自动匹配,如只输入get-he,然后按下“Tab”键,屏幕上就可以出现完整的Get-Help命令。

Get-Help、Get-Command是PowerShell中非常重要的两个命令,可以获取帮助和获取所有的命令列表,如输入:

Get-Command

结果如下图所示,列出了所有的命令:

TerryLee_0209

与.NET Framework交互

Windows PowerShell更强大的地方在于它可以访问.NET Framework的类库,我们可以使用New-Object命令来创建一个.NET  Framework中的类实例,并保存在变量中,如下面的命令:

$d = New-Object -TypeName System.DateTime

这里使用New-Object来创建一个DateTime对象,使用-TypeName指定类型名称,创建的对象保存在$d变量中,输出结果如下图所示:

TerryLee_0205

除此之外,还可以使用-ArgumentList来指定参数,如下图所示:

TerryLee_0206 

与COM交互

使用Windows PowerShell还可以完全与COM交互,这使的Windows PowerShell的功能更加强大,有了上面前面提到的访问WMI、与.NET Framework交互,再加上与COM交互,可以说Windows PowerShell几乎无所不能。如下面看一个例子,使用PowerShell来访问IE,可以使用如下命令来创建一个IE的对象,并让它导航到博客园首页:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $true
$ie.Navigate("http://www.cnblogs.com")
$ie.Quit()

简单解释一下这段代码,首先创建一个IE的COM对象,并让它显示,然后导航到博客园首页,最后程序退出。如下图所示:

TerryLee_0207 

在这个过程中,大家会看到系统打开了一个IE窗口,并且导航到了博客园。

访问注册表

除此之外,Windows PowerShell还可以实现对注册表的完全控制,包括查询所有的Entry,或者修改、删除键值等,可以说是一切皆可控制,如使用下面的命令:

Get-ChildItem -Path hkcu:\

输出如下图所示,列出了HKEY_CURRENT_USER下面的信息:

TerryLee_0208

创建别名

在Windows PowerShell中,还允许为命令创建自己熟悉的别名,这样对于某些太长的命令名可以使用自己的缩写来表示,或者对于某些不太容易记忆的命令,使用自己喜欢的名字来表示。

Set-Alias gh Get-Help

这里设置gh为Get-Help命令的别名,这样在后面的操作中,当输入gh后,执行的命名就是Get-Help,如下图所示:

TerryLee_0210 

输出文件

在Windows PowerShell中,我们还可以把操作的结果输出到一个文件中,可以使用Out-File命令,另外可以使用-FilePath来指定输出的路径和文件名,如下命令所示:

Get-Process | Out-File -FilePath C:\temp.txt

现在打开C盘的temp.txt文件,可以看到输出的结果如下所示:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName 
------- ------ ----- ----- ----- ------ -- -----------
126 4 13272 10220 47 1204 audiodg
73 4 2936 8080 61 1.05 3580 conime
512 5 2188 4112 59 2.06 532 csrss
511 7 5704 19744 182 93.44 588 csrss
1249 109 127144 157128 561 44.67 6648 devenv
188 8 47088 73332 164 2,020.61 2508 dwm
2261 48 75040 72600 416 341.38 2548 explorer
0 0 0 24 0 0 Idle
664 28 36696 49076 173 14.78 3384 iexplore
969 35 74868 87576 328 43.92 7480 iexplore
404 10 7280 640 96 6.23 2812 kavstart
65 3 1368 3360 46 0.09 316 kissvc
80 5 6592 1012 62 1.28 496 kmailmon

以上所介绍只是Windows PowerShell强大功能的冰山之一角,除此之外,还可以与WMI交互,访问机器设备,对于输出结果格式化等等,这里不再介绍。

总结

本文中简单介绍了一下Windows PowerShell,相信通过这些介绍大家已经看到了Windows PowerShell的强大之处,而且在微软以后的产品中,都会支持使用PowerShell进行管理。

来源:http://www.cnblogs.com/Terrylee/archive/2008/11/09/Windows-PowerShell-Overview.html 
posted @ 2012-05-31 14:41  陳聽溪  阅读(719)  评论(0编辑  收藏  举报