打印

简介Windows PowerShell

没见过的说~~~~~

TOP

这个帖子放在这里,我自己都觉得有点滑稽。

争取继续下去。

TOP

cmdlet的参数

cmdlet参数以前缀横杠`-'识别,斜杠/不再被使用,输入参数可以是完整的名称,也实际只需要输入足够与其它参数区别的部分就可以了。

比如说:Get-Help有一个参数名为"Detailed",但你只需要输入"-Det",因为这样已经足够与Get-Help的另一个以De开头的参数"Debug"相区分吧。

有些参数名称是可选的,你可以只输入参数的值,而不必输入它的名称。

比如Get-Help cmdlet的"Name"参数用以指明需要获取帮助的cmdlet或概念名。但你既可以输入"Name"参数名,也可以不去管它。要获取Get-Alias cmdlet的帮助,可以用

[code:1]get-help -name get-alias[/code:1]



[code:1]get-help get-alias[/code:1]

的任何一个形式

要查找哪些参数名是可选的,参见帮助文件的语法块,可选的参数出现在方括号包括中:

[code:1]Get-Help [[-name] <string>]...[/code:1]

TOP

格式化cmdlet输出

传统shell中,不同命令决定了自身的输出格式。一些命令可以定制输出格式,它们包含了控制输出格式的参数。

在Windows PowerShell中,唯一用于格式化输出的是format cmdlets:

  • Format-List[/list:u]
    • Format-Custom[/list:u]
      • Format-Table[/list:u]
        • Format-Wide[/list:u]

          除此以外,其余cmdlet并不格式化输出。你不需要为不同命令单独学习格式化输出的方法,只要学习Format cmdlets即可。

          当运行一个cmdlet,PowerShell根据要显示的数据类型,自动调用默认的格式化工具。格式化工具决定了输出的哪些属性会被显示,是以列表还是表格的格式显示。

          例如:当运行Get-Service cmdlet后,它的默认输出是三列表格:

          [code:1]Status   Name               DisplayName
          ------   ----               -----------
          Running  Alerter            Alerter
          Running  ALG                Application Layer Gateway Service
          Stopped  AppMgmt            Application Management[/code:1]

          要改变默认的输出格式,使用管道符(|)将cmdlet的输出送至format cmdlets之一。
          比如说:下面的命令将Get-Service的输出送至Format-List,结果是每个服务的服务数据被格式化成了一个列表。

          [code:1]Name                : Alerter
          DisplayName         : Alerter
          Status              : Running
          DependentServices   : {}
          ServicesDependedOn  : {LanmanWorkstation}
          CanPauseAndContinue : False
          CanShutdown         : False
          CanStop             : True
          ServiceType         : Win32ShareProcess

          Name                : ALG
          DisplayName         : Application Layer Gateway Service
          Status              : Running
          DependentServices   : {}
          ServicesDependedOn  : {}
          CanPauseAndContinue : False
          CanShutdown         : False
          CanStop             : True
          ServiceType         : Win32OwnProcess[/code:1]

          这个格式的输出,不光是列表和表格的区别,并且每个服务的信息显示得更多。每个服务的数据由三列,变为了九行。Format-List并不会获取额外的服务信息,数据都包含在Get-Service得到的对象中,只不过默认的格式工具Format-Table省略了其中的一部分,因为屏幕显示不能超过三列。

          除了决定数据以列表还是表格形式显示,你还可以决定显示对象的哪些属性。Get-Service默认只显示服务对象Status, Name, DisplayName属性。

          要查看某一对象的所有属性,用管道符(|)将命令的输出送至Get-Member cmdlet,查看服务对象的所有属性:
          [code:1]PS C:\Documents and Settings\dani> get-service | get-member -membertype *propert
          y


             TypeName: System.ServiceProcess.ServiceController

          Name                MemberType    Definition
          ----                ----------    ----------
          Name                AliasProperty Name = ServiceName
          CanPauseAndContinue Property      System.Boolean CanPauseAndContinue {get;}
          CanShutdown         Property      System.Boolean CanShutdown {get;}
          CanStop             Property      System.Boolean CanStop {get;}
          Container           Property      System.ComponentModel.IContainer Container...
          DependentServices   Property      System.ServiceProcess.ServiceController[] ...
          DisplayName         Property      System.String DisplayName {get;set;}
          MachineName         Property      System.String MachineName {get;set;}
          ServiceHandle       Property      System.Runtime.InteropServices.SafeHandle ...
          ServiceName         Property      System.String ServiceName {get;set;}
          ServicesDependedOn  Property      System.ServiceProcess.ServiceController[] ...
          ServiceType         Property      System.ServiceProcess.ServiceType ServiceT...
          Site                Property      System.ComponentModel.ISite Site {get;set;}
          Status              Property      System.ServiceProcess.ServiceControllerSta...[/code:1]

          所有这些属性都存在于Get-Service获取的每一个服务的对象中,你可以选择显示其中的任何一个或者全部。使用Format cmdlets的"Property"参数选择需要显示的属性。

          例如:下面命令使用Format-Table显示每个服务的Name, ServiceType, CanShutDown属性。

          [code:1]get-service | format-table  Name, ServiceType, CanShutDown[/code:1]

          这只是学习控制PowerShell显示的开始,还是用Get-Help获取Format cmdlets更为详细的帮助。

          [code:1]get-help format-list
          get-help format-table
          get-help format-wide
          get-help foramt-custom[/code:1]

TOP

使用别名

cmdlet的名称输入起来很是累赘。为了少打字,并且使熟悉其它shell的用户对PowerShell更容易上手。PowerShell支持别名的概念,也就是命令的替代名字。你可以为cmdlet, 函数,可执行文件起别名,并且输入别名来代替命令的真名。

PowerShell内建了很多别名,你也可自行建立。建立的别名只在当前shell会话中有效,要创建永久别名,需要添加到PowerShell的profile中。

要查明所有当前会话中的别名,输入:

[code:1]get-alias[/code:1]

查看一个cmdlet所有的别名:

[code:1]get-alias | where-object {$_.definition -eq "<cmdlet-name>"}[/code:1]

PowerShell的别名是由Windows PowerShell Alias provider, 一个.NET assembly类库支持的,它能让你像Windows文件系统驱动器一样查看别名。这个别名的驱动器是alias:

进入该驱动器,输入:

[code:1]set-location alias:[/code:1]

查看所有别名,即alias:驱动器下所有子项目,输入

[code:1]get-childitem[/code:1]

从另一磁盘查看alias:驱动器下所有子项目:

[code:1]Get-ChildItem alias:[/code:1]

TOP

创建别名

要在PowerShell中为cmdlet和命令创建别名,可用Set-Alias cmdlet。例如,为Get-Help创建一个叫做gh的别名:

[code:1]set-alias gh get-help[/code:1]

也可为命令建立别名,如启动一个GUI程序的命令。为Notepad创建别名np:

[code:1]set-alias np C:\WINDOWS\notepad.exe[/code:1]

注意,notepad的路径可能随系统而不同。

TOP

删除别名

要删除一个别名,也即用Remove-Item cmdlet从Alias:驱动器删除一个项目。

例如,要删除ls这个别名:

[code:1]remove-item alias:ls[/code:1]

TOP

使用函数创建替代名称

你可以为cmdlet,函数,命令建立别名,但无法为带参数的命令建立别名。但是,你可以创建函数,它和别名很相似。

比如,在Windows XP系统中用notepad打开boot.ini需要输入:

[code:1]notepad C:\boot.ini[/code:1]

你不可能为notepad C:\boot.ini建立别名,但是你可以创建一个函数:

[code:1]function bootini {notepad C:\boot.ini}[/code:1]

函数和别名类似,如果在PowerShell提示符下输入bootini,notepad启动打开boot.ini。

TOP

使用Windows程序

在PowerShell中,既可以运行Windows命令行程序,也可启动图形界面程序。如果程序输出文本,你可以捕获文本,在新的shell中使用,就像在任何其它shell中一样。

在PowerShell中运行一个程序,如Notepad,这个程序的可执行文件必须位于Path环境变量包含的目录中。Path环境变量决定了PowerShell何处查找程序和脚本(cmdlet不包含在内)。

查看Path环境变量包含的路径,输入:

[code:1]$env:path[/code:1]

向Path环境变量加入新的目录:

[code:1]$env:path += ";new-directory"[/code:1]

例如将WordPad所在目录加入路径:

[code:1]$env:path += ";C:\Program Files\Windows NT\Accessories"[/code:1]

如同set命令,该分派语句只影响当前PowerShell会话的路径,要使改变永久化,将此语句加入Windows PowerShell的profile文件中。Profile的话题将在后面涉及。

TOP

处理错误

使用shell时偶尔会遇到错误,比如切换位置至不存在的目录,欲删除无需要权限的文件等。

PowerShell中,错误分为两类:

终止错误: 错误可使得命令执行停止;
非终止错误: 错误不至于使命令执行停止。

比如,当你要删除目录中所有.TMP文件,你不希望其中某一文件不能被删除而使整个操作停止。通常,你会要删除所有可删除的文件,然后回去检查那个不能被删除的文件。

不能删除某个文件时发生的错误叫非终止错误,当非终止错误发生时,PowerShell不管该错误,继续执行命令,并显示错误输出。

更严重的错误可使命令终止,这些被称作终止错误。比如你提交了无效数据,没有权限执行命令,PowerShell会产生终止错误。

TOP

游历PowerShell

PowerShell最强大的特色之一是可以让你用和游历常规文件系统相似的技巧游历多种不同的数据存储。

除了熟悉的系统驱动器如C:, D:等,PowerShell还包括代表HKEY_LOCAL_MACHINE(HKLM, HKEY_CURRENT_USER(HKCU注册表hive,本机数字签名存储(Cert,当前会话函数(Function等,它们被称为PowerShell驱动器。

PowerShell自带多个有用的驱动器,要获取PowerShell驱动器列表,请输入:

[code:1]Get-Psdrive[/code:1]

TOP

游历文件系统

当你启动PowerShell,你或许会习惯性地想输入cd, dir, ls等熟悉的命令,就这么做吧。cd是Set-Location cmdlet的别名,它将当前位置改变至指定路径。dir和ls都是Get-Childitem的别名,它用来获取某一位置的子项目。可用Set-Location(cd), Get-Childitem(dir, ls)结合遍历文件系统驱动器。在PowerShell中,驱动器以驱动器名跟随(冒号指示,如C:,父项目和子项目间用反斜杠(\)或斜杠(/)分隔,如C:\WINDOWS\System32

一些特色使得游历文件系统更为方便:

(.)符号代表当前目录,(*)代表目录中的内容;
内建变量$home代表家目录,$pshome代表PowerShell安装目录。

和其它shell一样,你可以改变位置,创建、删除、移动、复制目录和文件,改变它们的属性。使用tab补全路径名。更详细信息,参见Item cmdlets(Get-Item, Get-ChildItem, New-Item, Remove-Item, Set-Item, Move-Item, Copy-Item)的帮助。

TOP

游历注册表

你可用和游历文件系统驱动器类似的技巧游历注册表。PowerShell中,注册表HKEY_LOCAL_MACHINE hive映射为HKLM: PowerShell驱动器,而HKEY_CURRENT_USER hive被映射为HKCU: PowerShell驱动器。

示例:

[code:1]PS C:\> cd HKLM:
PS HKLM:\> dir


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE

SKC  VC Name                           Property
---  -- ----                           --------
  4   0 HARDWARE                       {}
  1   0 SAM                            {}
Get-ChildItem : Requested registry access is not allowed.
At line:1 char:3
+ dir <<<<
26   0 SOFTWARE                       {}
  8   0 SYSTEM                         {}[/code:1]

你或许注意到,在注册表驱动器中dir(Get-ChildItem)的输出和文件系统驱动器中的不同。注册表驱动器包含的信息不同,PowerShell相应提供了不同的数据视图。在此,重要的是获知有多少子键和项,因此输出中包含了子键总数(SKC)和项值总数(VC),以及子键和项的名字。

[code:1]PS HKLM:\> cd 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'
PS HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager> dir


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentC
ontrolSet\Control\Session Manager

SKC  VC Name                           Property
---  -- ----                           --------
  0   1 AppCompatibility               {AppCompatCache}
15   0 AppPatches                     {}
  0   6 DOS Devices                    {AUX, MAILSLOT, NUL, PIPE...}
  0  15 Environment                    {ComSpec, Path, windir, FP_NO_HOST_CH...[/code:1]

直至遇到注册表项之前,你不会觉得有什么不同。注册表键中的项被看作它们所在键的属性,因此,你可以用Get-ItemProperty去获取它们。

比如,要通过注册表获得本机的主机名:

[code:1]PS C:\> cd HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
PS HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters> Get-ItemProperty -p
ath . -name hostname


PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\Cu
               rrentControlSet\Services\Tcpip\Parameters
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\Cu
               rrentControlSet\Services\Tcpip
PSChildName  : Parameters
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
Hostname     : MozilaFoundation[/code:1]

TOP

游历证书存储

你还以游历存储于本机的数字签名证书,他被映射为PowerShell驱动器Cert:

TOP

其它驱动器

除上述驱动器外,PowerShell还自带其它数个有用的驱动器。包括:

别名(Alias
环境变量(Env
函数(Function
变量(Variables

都用同样的基本技巧游历。

TOP