从Windows10创意者更新开始,PowerShell正式上位替换了命令提示符CMD。不论是Windows+X右键超级菜单,还是Shift+文件夹空白处右键,又或在文件资源管理器文件菜单中,都没有命令提示符CMD的身影了,全部都由PowerShell取而代之了。长期使用CMD的Windows系统管理员或Windows命令行极客恐怕一时不能适应,使用CMD都只能去开始菜单-所有应用-Windows系统-命令提示符打开使用,藏得这么深,显然是不想让人用了啊。
图1:PowerShell打开方式
问题来了,PowerShell这货凭什么力压CMD,强行上位?如果你之前试用过PowerShell,相信它一定没有给你什么好印象。打开慢!反应慢!命令还陌生!还动不动就弹一大堆谁都看不懂错误,PowerShell究竟凭什么在Windows10创意者更新中替代命令提示符CMD呢?微软脑抽了?
微软没有脑抽,PowerShell是凭借其强大的功能替换CMD的。这里要先说明以下PowerShell究竟是什么东西,或者它究竟是不是东西?
Windows PowerShell不是东西,它是专为系统管理员设计的新Windows命令行shell,它包括交互式提示和脚本环境。PowerShell定义很多命令与操作系统,特别是与文件系统交互,能够启动应用程序,甚至操纵应用程序;PowerShell允许将几个命令组合起来放到文件里执行,实现文件级的重用,也就是说有脚本的性质;PowerShell能够充分利用.Net类型和COM对象,来简单地与各种系统交互,完成各种复杂的、自动化的操作。
用人话说就是CMD能做的PowerShell都能做,CMD不能做的Powershell也能做。就是这么自信!不信?赶紧打开PowerShell把下面的命令复制进去,看看它干了什么事,然后你用CMD做出来吧!
# create new excel instance
$objExcel = New-Object -comobject Excel.Application
$objExcel.Visible = $True
$objWorkbook = $objExcel.Workbooks.Add()
$objWorksheet = $objWorkbook.Worksheets.Item(1)
# write information to the excel file
$i = 0
$first10 = (ps | sort ws -Descending | select -first 10)
$first10 | foreach -Process {$i++; $objWorksheet.Cells.Item($i,1) = $_.name; $objWorksheet.Cells.Item($i,2) = $_.ws}
$otherMem = (ps | measure ws -s).Sum - ($first10 | measure ws -s).Sum
$objWorksheet.Cells.Item(11,1) = "Others"; $objWorksheet.Cells.Item(11,2) = $otherMem
# draw the pie chart
$objCharts = $objWorksheet.ChartObjects()
$objChart = $objCharts.Add(0, 0, 500, 300)
$objChart.Chart.SetSourceData($objWorksheet.range("A1:B11"), 2)
$objChart.Chart.ChartType = 70
$objChart.Chart.ApplyDataLabels(5)
图2:使用PowerShell生成Excel图表
上面一段代码是PowerShell界常见的一段神代码,很多初学者被其带入了PowerShell的大门。有效代码不过20来行,作用是把当前系统中最占内存的10个进程的数据发送到Excel中,并绘制成三维饼图。CMD是很难做到了,被替代也理所应当了。
PowerShell的定位是操作系统和应用程序的管理工具,从这个角度看,它是CMD的升级版,并非简单的对CMD进行扩展,事实上微软也不打算扩展和升级CMD了,以后PowerShell将全方位的替代CMD,目前CMD和PowerShell还是并存状态。
下面正式介绍PowerShell。
一、简单的命令
在CMD中,命令是从非常简单(如attrib.exe)到非常复杂(如netsh.exe)的可执行程序,新入门用户一旦遇到复杂命令,只能束手无策,只能求助搜索引擎,解决当前需求之后,就把命令的用法抛诸脑后,下次使用又要重新学习,极其不便。
图3:复杂的netsh命令
PowerShell命令设计非常规范,它的命令由“动词”和“名词”两部分组成,比如“get”表示检索数据,“process”表示系统进程,把“get”和“process”组合起来的PowerShell命令就是“get-process”,意思是获取系统进程列表,这种命令在PowerShell中称为“cmdlet(读作“command-let”)”。
图4:使用get-process命令获取系统进程
像“get-process”这样“动词-名词”结构有个好处,具有相同“名词”的命令通常是一类命令,比如都拥有“process”的命令有:
图5:拥有“process”的命令
使用“动词-名词”结构还有一个好处,就是不同的“动词”和“名词”可以自由组合,很少的几个“动词”和“名词”就可以组合出大量的可用命令,使命令记忆量大为降低,只需记住简单的几个词语,就可以使用大量的命令,这是包括命令提示符CMD在内的Shell不具备的,并且不会产生歧义,对新用户非常友好。
二、别名系统
“动词-名词”结构的cmdlet固然对新手友好,但也带来了另一个问题,命令名称过长,在命令行交互使用时不方便,在命令行窗口输入命令可以使用Tab键进行补全,可是经常使用还是需要键入大量的内容,要是能够把命令缩短一些就好了。PowerShell在设计时已经考虑到了,为此创建了别名系统,之所以叫名别系统,是因为PowerShell中的别名非常强大,能够非常方便的对别名进行增加、删除、修改,还为之创建了别名驱动器,可以像访问文件系统驱动器一样方便的访问别名驱动器。
PowerShell非常贴心的为用户创建了大量内置别名,一方面减少了常用命令的输入长度,另一方面也为熟悉其它Shell而不熟悉PowerShell的用户提供了方便,常见Shell如bash、cmd,PowerShell都为用户提供了他们熟悉的别名。下面是可以在Powershell中使用的通用的Cmd.exe和UNIX命令的简短列表。
图6:PowerShell兼容性别名列表
PowerShell除了自带别名外,用户自己也可以创建别名,不仅仅可以为cmdlet创建别名,也可以为PowerShell函数、带参数的命令和包含完整路径的命令行程序创建别名。
比如为记事本创建别名,可以使用如下命令:
New-Alias np c:\windows\notepad.exe
创建别名完成后,在命令行中输入np就能直接打开记事本。在命令行中创建的别名只能在当前命令行窗口中使用,如果想以后也能使用此别名,可以把以上命令保存在PowerShell配置文件中,以后无论是在命令行中,还是使用脚本,都可以在本机使用np别名了。PowrShell配置文件位置可以使用$profile命令查询。
想查看当前命令行窗口可以使用的别名,可以进入别名驱动器查看,使用dir alias:就能查看所有能用的别名,也可以使用get-alias命令查看别名。
图7:查看PowerShell别名驱动器
三、管理任务
Windows PowerShell的基本目标是使用户能够以交互方式或通过脚本更好、更容易地对系统进行管理控制,为了达成这个目标,PowerShell提供了大量命令来执行各种管理任务,让用户轻松完成管理系统任务。
1、管理进程
前面已经提过管理系统进程的命令,管理进程常用命令就是get-process命令和stop-process命令,get-process命令获取进程之后可以直接用管道发送给stop-process命令结束进程。比如,关闭之前打开的记事本,可以使用下面的命令很方便的关闭记事本。
get-process -Name notepad | stop-process
2、处理文件和文件夹
PowerShell使用Get-ChildItem获取文件夹中直接包含的所有项,它有系统内置别名dir和ls,使用CMD和BASH的用户均可以轻松上手。如果想查看C:中的文件夹和文件,直接使用dir c:,PowerShell立刻就会列出C:中的文件和文件夹。其它处理文件和文件夹的命令有Copy-Item、New-Item、Remove-Item等,具体用法可以使用get-help然后跟命令名称即可查询。
3、处理系统服务
可以像管理进程一样管理系统服务,Get-Service命令获取服务列表,Stop-Service命令停止服务,Start-Service命令启动服务,Suspend-Service命令挂起服务,Restart-Service命令重启服务,Set-Service服务设置服务属性。如果想一次性启动已经停止的服务,可以使用以下命令:
get-service | where-object {$_.Status -eq "Stopped"} -exclude
wisvc | start-service
这行命名会把除wisvc之外的命令都启动,这只是一个示例,不要在自己电脑使用,启动所有服务会消耗大量系统资源。
4、处理注册表
PowerShell可以非常方便的处理注册表项目,与进程和服务不同的是,PowerShell并未提供专用的注册表命令,而是使用处理文件和文件夹的命令,这并不奇怪,PowerShell为用户提供了注册表驱动器,可以很好的处理注册表项目。由于注册表对系统非常重要,错误处理注册表也许会导致系统出问题,处理注册表,特别是删除注册表项目要非常小心,最好能在处理注册表项目之前先备份要处理的项目。没有管理员权限也能处理部分注册表项目,这与regedit注册表编辑器不同,注册表编辑器必须使用管理员权限打开,然后才能操作项目。
图8:无管理员权限访问HKLM:驱动器
下面的表格列出了访问注册表所需的所有命令。
图9:处理注册表的命令与预定义的注册表驱动器
PowerShell只提供了两个注册表驱动器HKCU:和HKLM:,其中HKLM:是HKEY_LOCAL_MACHINE的缩写,HKCU:是HKEY_CURRENT_USER的缩写,如果想要访问所有注册表驱动器,可以进入Microsoft.PowerShell.Core\Registry::。
5、处理其它任务
PowerShell还可以处理证书、防火墙、appx应用、打印机等任务,篇幅所限,不具体举例。大家可以使用get-command命令查找相关命令。