Board logo

标题: [转载教程] 【探索PowerShell 】【四】PowerShell的对象、格式与参数 [打印本页]

作者: HAT    时间: 2013-8-30 17:14     标题: 【探索PowerShell 】【四】PowerShell的对象、格式与参数

【探索PowerShell 】【一】初识http://www.bathome.net/thread-26144-1-1.html
【探索PowerShell 】【二】基本操作http://www.bathome.net/thread-26148-1-1.html
【探索PowerShell 】【三】PowerShell下使用Aliaseshttp://www.bathome.net/thread-26149-1-1.html
【探索PowerShell 】【四】PowerShell的对象、格式与参数http://www.bathome.net/thread-26159-1-1.html
【探索PowerShell 】【五】PowerShell基础知识http://www.bathome.net/thread-26162-1-1.html
【探索PowerShell 】【六】脚本基础简要http://www.bathome.net/thread-26163-1-1.html
【探索PowerShell 】【七】变量http://www.bathome.net/thread-26165-1-1.html
【探索PowerShell 】【八】数组、哈希表(附:复制粘贴技巧)http://www.bathome.net/thread-26166-1-1.html
【探索PowerShell 】【九】条件控制、逻辑http://www.bathome.net/thread-26167-1-1.html
【探索PowerShell 】【十】循环语句http://www.bathome.net/thread-26168-1-1.html
【探索PowerShell 】【十一】函数http://www.bathome.net/thread-26174-1-1.html
【探索PowerShell 】【十二】筛选器 - Filtershttp://www.bathome.net/thread-26187-1-1.html
【探索PowerShell 】【十三】WMI对象http://www.bathome.net/thread-26188-1-1.html
【探索PowerShell 】【十四】使用WMI对象的方法http://www.bathome.net/thread-26189-1-1.html
【探索PowerShell 】【十五】引号与转义字符http://www.bathome.net/thread-26190-1-1.html

本节将要给大家介绍一下PowerShell下的对象,基本格式以及参数。依然属于PowerShell的基础。

PowerShell中的对象

在本教程开篇我们说过,PowerShell是基于面向对象化的,不像传统的shell那样基于文本。这其中最主要的原因就是因为Win平台在管理操作上主要以面向对象为主,因此为了符合系统特点和我们的操作习惯,PowerShell也继承了这一特色。因此,不像传统的shell,在PowerShell中,我们可以随意地与对象进行互动,

先来认识一下,什么是对象——object

不知各位有没有从事开发的经验。实际上,面向对象这一概念的提出就是为了更好用程序语言解决现实问题而提出的。

废话不多说,直接切入正题。在PowerShell中,“对象”是指我们收集信息或者执行操作的行为。包括属性(信息,我们可以收集)和方法(我们可以执行)。

有一个生动的例子——“灯泡”。对象是显而易见的,它是一个灯泡。一个灯泡的属性可能包括了其颜色,功率和类型(荧光灯,白炽灯或卤素灯)。对于它的操作,或者称之为方法,则是我们可以执行的行为,如打开和关闭。这很容易理解!

让我们看看在PowerShell中一个对象的属性以及其方法。

首先,你可能会经常使用它"Get-Member”,这个cmdlet是用来检查一个对象具有哪些属性和方法的。

例如:
  1. get-service | get-member
复制代码
使用这条命令就可以查看"get-service”t的属性和方法。在这个例子中,我们使用管道符来进行命令的传递。运行结果如下:

PS D:\> get-service | get-member


   TypeName: System.ServiceProcess.ServiceController

Name                      MemberType    Definition
----                      ----------    ----------
Name                      AliasProperty Name = ServiceName
RequiredServices          AliasProperty RequiredServices = ServicesDependedOn
Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)
...


当然,我们可以使用"get-member"的参数来查看"get-service"的所有的属性类对象,或者方法类对象。

例如:

查看"get-service"的所有属性类对象
  1. Get-Service | Get-Member -MemberType Property
复制代码
查看get-service"的所有方法类对象
  1. Get-Service | Get-Member -MemberType Method
复制代码
为什么我们如此的强调对象?原因就是在PowerShell中,所有的一切都是对象。

例如:

我们要找出指定日期写入d:\的文件有哪些,使用如下命令:
  1. Get-ChildItem -Path d:\ -Recurse | Where-Object {$_.LastWriteTime -gt "01/01/2010"}
复制代码
现在来解释一下:

首先,"get-childitem"是用来枚举我们的文件系统的,使用"-path"参数,将路径指向"d:\",使用"-recurse"参数,意味着将显示所有的文件,甚至是子目录下的。接下来,我们将结果使用管道符传递给循环声明"where-object"中,用来筛选出符合条件的结果。

那么,"lastwritetime"又是什么?

我们使用如下命令看看"get-childitem"都有哪些属性可供我们筛选:
  1. get-childitem | get-member
复制代码
...
LastAccessTime            Property       System.DateTime LastAccessTime {get;set;}
LastAccessTimeUtc         Property       System.DateTime LastAccessTimeUtc {get;set;}
LastWriteTime             Property       System.DateTime LastWriteTime {get;set;}
LastWriteTimeUtc          Property       System.DateTime LastWriteTimeUtc {get;set;}
...


对,就是这个。我们需要筛选出的对象属性就是最后写日期。在后面的定义中可以看到"LastWriteTime"会将一个"Syetem.DateTime"数据类型作为反馈。因此,在整个语句的后半部,我们使用了"-gt"进行进一步的筛选,"-gt"是"greater than"的缩写,意味“大于”。在以后的教程中我将会介绍更多类似这样的操作。前面说到,"LastWriteTime"是一个"Syetem.DateTime"类型的数据,因此,我们最终使用类似"01/01/2010"这样的表达。这一点需要大家多加注意,在以后的运用中需要注意数据类型。

后续的教程中,我还会尽可能全面的介绍WMI、COM以及 .NET,不过,我们现在知道并掌握上面的就足够了。

PowerShell的格式

在这一小节,我将介绍PowerShell中的格式化输出。当我们使用一个cmdlet时,参数"format-"允许我们选择一种习惯的输出模式。使用以下命令试一试:
  1. Get-Command Format-*
复制代码
其结果为:

PS D:\> Get-Command Format-*

CommandType     Name                                                Definition
-----------     ----                                                ----------
Cmdlet          Format-Custom                                       Format-Custom [[-Property] <Object[]>] [-Depth <...
Cmdlet          Format-List                                         Format-List [[-Property] <Object[]>] [-GroupBy <...
Cmdlet          Format-Table                                        Format-Table [[-Property] <Object[]>] [-AutoSize...
Cmdlet          Format-Wide                                         Format-Wide [[-Property] <Object>] [-AutoSize] [...


好了,这一个知识点很简单。请各位童鞋使用如下命令试一试,结果怎么样看看就知道了。
  1. get-childitem c:\windows | format-table
复制代码
  1. get-childitem c:\windows | format-table -autosize
复制代码
  1. get-childitem c:\windows | format-custom
复制代码
  1. get-childitem c:\windows | format-list
复制代码
  1. get-childitem c:\windows | format-list -Property FullName
复制代码
  1. get-childitem c:\windows | format-wide
复制代码
当然,复杂些的还有以下这些,我不想解释过多,大家只要肯亲自动手试一试,一眼就能看明白。
  1. Get-ChildItem C:\Windows -Recurse | Format-List -Property FullName,CreationTime,LastWriteTime
复制代码
  1. Get-ChildItem C: | Format-Wide -Column 3
复制代码
另外,在其他cmdlet中,存在其他格式的输出。例如,在"get-process"中就有"group-object","Get-EventLog"中我们可能用到"Sort-Object",甚至,我们可以输出为特定格式的文件,例如使用"Convertto-HTML"输出为html,使用"Export-CSV"输出为表格文件(可以使用Excel打开)。

统统举例如下(记住管道符):
  1. Get-Process | Group-Object Company
复制代码
  1. Get-EventLog System | Group-Object eventid
复制代码
  1. Get-EventLog System | Group-Object eventid | Sort-Object Count -descending
复制代码
  1. Get-Process | ConvertTo-html
复制代码
  1. Get-Process | ConvertTo-html | out-file "Processes.html"
复制代码
  1. Get-Process | Export-CSV Processes.csv
复制代码
至于打开文件,使用如下命令即可:
  1. Invoke-Item Processes.html
复制代码
  1. Invoke-Item Processes.csv
复制代码
看看截图吧(输出为".CSV"文件):

PS D:\BatHome> get-process | Export-CSV Processes.csv
PS D:\BatHome> ls


    Directory: D:\BatHome


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         8/30/2013   3:03 PM          0 bathome.txt
-a---         8/30/2013   3:03 PM          0 bbs.txt
-a---         8/30/2013   3:04 PM          0 net.txt
-a---         8/30/2013   5:09 PM      37510 Processes.csv


使用"Invoke-Item"命令打开:
  1. Invoke-Item Processes.csv
复制代码
使用PowerShell的格式化输出是不是很简单呢?个人认为比VBScript要更加容易上手一些。管理系统更加方便!

PowerShell的常见参数

我们前面介绍过,为了简化我们的记忆,PowerShell对cmdlet使用了全新的"动词-名词"的命名方式,更加方便的是,几乎所有的cmdlet都拥有统一的标准化参数,当然,我说了,几乎所有的——并非全部。下面这个列表,列举出了“公共参数”(这些参数的名称是我们无法自定义使用的):

-confirm 在执行cmdlet前提示用户。
-debug  提供相关调试信息。
-ErrorAction 提示cmdlet在执行某项操作时可能出现的错误。如:继续,停止等。
-ErrorVariable  使用一个特定的变量($error)来保存错误信息。
-OutVariable 用于保存输出信息的变量。
-OutBuffer 确定在进行下一次管道传递前需要缓存的对象数量。
-Verbose 为我们提供更多细节。
-whatif  并不会真正执行cmdlet,只是告诉你会发生什么。

此外,PowerShell中还保留了这些参数的下列别名:vb、db、ea、ev、ov 和 ob。

参数太多不好记?好办,记得使用"Tab"键,如:
  1. get-service -<Tab>
复制代码
或者使用帮助命令"get-help":
  1. get-help get-service -full
复制代码
好了,我们做一些简单的演示吧:
  1. Set-ExecutionPolicy Unrestricted -whatif
复制代码
PS D:\> Set-ExecutionPolicy Unrestricted -whatif
What if: Performing operation "Set-ExecutionPolicy" on Target "Unrestricted".


是不是很方便?在执行cmdlet之前,"-whatif"就会告诉你接下来会发生什么。

那么如下这条cmdlet呢:
  1. Set-ExecutionPolicy Unrestricted -confirm
复制代码
PS D:\> Set-ExecutionPolicy Unrestricted -confirm

Confirm
Are you sure you want to perform this action?
Performing operation "Set-ExecutionPolicy" on Target "Unrestricted".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):


是的,它将返回一条验证操作,以获取用户的进一步许可。只是"Y"、"A"、"N"、"L"与"?"我们都能轻易理解,那么"S"呢?

请注意观察以下执行结果:

Set-ExecutionPolicy Unrestricted -confirm<enter>  
Are you sure you want…  
S<enter> (places the prompt in suspend mode as denoted by “>>”).  
>>Get-ExecutionPolicy<enter>  
Resricted (or whatever the policy is set to).  
>>exit<enter> (Typing “exit” leaves suspend mode and returns to the original command)  
Are you sure you want…  
Y<enter> (Confirms “Yes” and sets the ExecutionPolicy to “Unrestricted”).


PS D:\> Set-ExecutionPolicy Unrestricted -confirm

Confirm
Are you sure you want to perform this action?
Performing operation "Set-ExecutionPolicy" on Target "Unrestricted".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): s
PS D:\>>> Get-ExecutionPolicy
Unrestricted
PS D:\>>> exit

Confirm
Are you sure you want to perform this action?
Performing operation "Set-ExecutionPolicy" on Target "Unrestricted".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):


聪明的你,明白了么?

好了,本节内容就到这里。本节中对PowerShell中对象、格式与参数的介绍,仅仅是其冰山一角,在后续的教程中,我们将继续利用今天学习的来进行工作。当然,在本节中还有很多其他我们尚未涉及到的内容、参数等,希望各位童鞋能积极利用PowerShell中所提供的工具进行探索,如"get-help"、"get-member"命令等。

Ps:最后,非常感谢各位能热情而持续的关注本教程,如果您有任何意见或问题,请进行留言,我将做详细解答!谢谢。

本文出自 “马睿的技术博客” 博客,请务必保留此出处http://marui.blog.51cto.com/1034148/290535




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2