Powershell对象(数据的另一个名称)

智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述Powershell对象:数据的另一个名称相关的知识,希望能为你提供帮助。
那么我们首先需要理解什么是对象
我们使用GET-Process的话在我们的shell中会显示一个包含多了列的表格,在shell中并没有展示所有的内容,Shell会使用微软提供的配置文件并只显示微软认为你希望看到的列
我们可以使用这个命令来进行查看所有的信息,这个图我也是截取了一部分进行演示
??Get-Process | ConvertTo-html | Out-File d:\\process.html??

如果这样看的话我们可以看到第一行,我們可以看到有Name,ID,等等的這些都是屬性,而前面的Chrome則是一個對象
其实这样看到话也不是很明显    我们可以使用GM或者Get-Member ,GM是Get-Member的缩写

当我们使用GM后可以看到输出的结果,你会注意到一些不同种类的属性,记住属性总是包含一个值

  • 脚本属性             
  • 属性
  • NoteProperty(注释属性)
  • 别名属性
对象行为,也就是所谓的方法在上面的图中我们可以看到MemberType中有一个Method的一个类型,其中这个就是对属性行为的一个或者多个方法,其中比如我们要停止一个进程,那么我们就可以使用Kill这个方法。
Get-Process -Name Notepad | ForEach-Object kill($_.id)

但是在我们使用powershell中开始初期我们可能可以使用Cmdltes就可以解决我们的问题
Get-Process -Name Notepad | Stop-Process
#或者
Stop-Process -Name Notepad

排序对象大部分的Powershell Cmdlets以确定性的方式产生对象,这意味着每次运行命令时都会以相同的顺序产生对象,如果我们想自定义排序的方式呢,那么如果需要的话就可以使用 Sort-Object,假如我们对进程的VM虚拟内存进行排序怎么做呢
Get-Process |Select-Object -Property Name,vm | Sort-Object -Property vm

但是我们在执行完成后,发现其实是升序,如果我们要使用降序的话,我们可以使用man Sort-Object进行查看命令,会发现有一个参数-Descending,我们加上这个参数就可以是降序了,所以我们要多看帮助呢
Get-Process |Select-Object -Property Name,vm | Sort-Object -Property vm -Descending

选择需要的属性我们知道Cmdlet从管道中接受对象,默认情况下是由Powershell配置的规则来进行控制输出,如果我们需要指定希望显示的属性,需要使用 Select-Object来进行配置,减少返回列表
可以看到输出是我们指定想要的值,我们还可以去使用MAN进行查询,可以看到也是支持   -ExcludeProperty   排除属性   -ExpandProperty 展开属性
Get-Process | Select-Object-Property Comments,Name,VM,Id | ConvertTo-Html | Out-File d:\\process.html


命令运行的区别(Select-Object  和Sort-Object)
Get-Process | Sort-Object -Property vm -Descending |Out-File D:\\process.txt

在这个示例中,我们先运行了Get-Process ,该命令将进程对象放入管道。下一个命令是Sort-Object,该命令并不会改变管道中的内容,仅仅是改变对象的顺序,直到Sort-Object结束,管道仍然只包含进程。最后一个命令是Out-File,在这里Powershell生成输出结果,也就是管道中所包含的内容---进程对象,并根据Powershell的内部规则将对象格式化,最终结果被存入指定文件中。
Get-Process | Sort-Object -Property vm -Descending | Select-Object -Property NAME,Id,VM

该命令以同样的方式运行。Get-Process将进程放入管道中,接下来运行Sort-Object,该命令将同样的进程放入管道。但是Select-Object就有所不同了。进程对象总是拥有相同的成员。Select-Object并不能通过删除你不需要的属性减少属性列表。如果这样的话,结果就不再是进程对象,但是Select-Object创建一个名为PSObject的自定义对象,Powershell使用这个对象将属性从进程对象中复制出来,结果是自定义对象被放入管道。
Get-Process | Sort-Object -Property vm -Descending | gm
Get-Process | Sort-Object -Property vm -Descending | Select-Object -Property NAME,Id,VM | gm

注意:请运行这两个命令查看哪里不同,可以看到Sort-Object并没有改变原有的对象属性。但是我们可以看到Select-Object,之后的话它已经不是原先的对象了,而是经过了筛选后的值


【Powershell对象(数据的另一个名称)】当Powershell发现光标已经到达命令行结尾时,它必须知道如何对文本输出结果进行排版。这是由于管道中包含的对象不再是进程对象,Powershell不会再将默认规则和配置应用于进程对象,而是通过查询PSObject的规则和配置,这也是当前管道中包含的配置类型。由于PSObject用于自定义输出,微软并没有为PSObject提供任何的规则或配置。而是Powershell将尽最大努力猜测并产生表。理论上运行??Select-Object -Property NAME,Id,VM??后产生的表只有三列信息,但表并不像正常的Get-Process输出的结果那样有美观的排版,这是由于shell缺少使得表更美观的额外配置信息导致的。
动手练习1、找出生成随机数字的Cmdlet
man randomget-help Get-Random -examples

2、找出显示当前时间的Cmdlet,那么Cmdlet产生的对象类型是什么
Get-Dateget-help Get-Date -examples
TypeName:System.DateTime

3、使用任务2中的Cmdlet和select-object,只是显示星期几
Get-Date | Select-Object -Property DayOfWeek

4、找出可以在windows中显示以安装补丁的Cmdlet,显示已经安装的补丁列表,按照安装时间对列表进行排序,并仅显示如下几列:安装日期、补丁ID、安装用户
Get-HotFix
Get-HotFix |Sort-Object -Descending -Property InstalledOn| Select-Object -Property InstalledOn,HotFixID,InstalledBy

5、重复任务4,但是按照补丁描述进行排序,将结果保存到HTML文件
Get-HotFix |Sort-Object -Descending -Property description|
Select-Object -Property description,InstalledOn,HotFixID,InstalledBy | ConvertTo-Html |
Out-File d:\\hotfix.html

6、从一个日志中显示最新的50条列表,请按照时间升序对日志进行排序,同时也请按照索引进行排序。显示索引、时间以及每条记录的来源
Get-EventLog -LogName Application -Newest 50 | Sort-Object -Property TimeWritten,Index|
Select-Object -Property Index,TimeWritten,Source,Message |
ConvertTo-Html | Out-File d:\\log.html




    推荐阅读