面向对象

PowerShell是面向对象的Shell,我们不去深究什么是面向对象,什么是面向文本。 Linux的Shell是面向文本的,CMD也算是面向文本的Shell. 比如要过滤进程ID大于500,小于999.在Bash和CMD里很复杂,反正我没有成功的完成过。 但是在PowerShell里异常简单,还可以顺手排个序。

get-process | Where-Object {$_.id -gt 500 -and $_.id -lt 999} | sort id

可以使用.net的类型运算符,和功能函数。可以在Shell里面使用"."语法访问属性和调用方法。这个Shell唯一的上限就是您的知识和技能。它可以访问.net,api,wmi,com,可以使用C#添加模块。 .语法很方便

$t = Get-Item t.txt

#输出
PS >$t.Attributes
ReadOnly, Hidden, Archive

#修改属性
$t.Attributes = "Archive"

#输出
PS >$t.Attributes
Archive

管道

迭代器(Foreach-Object)、过滤器(Where-Object)、排序(Sort-Object)、选择器(Select-Object)可以接收大部分cmdlet的输出。 如果不想深入,除去功能cmdlet其它模块cmdlet如果接受管道输入。基本上是名词相同的cmdlet

比如:

Get-Localuser -name Bob | remove-Localuser
Get-Process -id 3367 | Stop-Process
Get-Service -Name bits | Stop-Service

管道的简单示例查找个人目录里大于50Mb的文件,按大小排序,选择最大的3个,把大小的单位换算成Mb:

Get-ChildItem -path $env:homepath -Recurse | Where-Object {$_.Length -gt 50Mb} `
| Sort-Object Length -Descending | Select-Object -First 3 -Property `
fullname,@{n="Length(MB)";e={($_.length / 1mb) -as [int]}}

模块

在没有cmdlet可以完成您的任务,这时候我们就可以去找找看,模块里有没有我们需要的东西。 比如想处理Sql Server,Office,等都可以在模块里找到,甚至还有web框架,谁会用PowerShell写web... Module.png