爱上PowerShell
Shell带来的好处是毋庸置疑的,当然也需要大量的时间去练习。PowerShell作为后起之秀,同时试图打造一款更加人性化,更加易用的Shell。随着PowerShell开源跨平台的战略以及在Windows下的的崛起,PowerShell有望成为下一个更加流行的Shell。
当然,PowerShell吸引我的地方不仅仅是开源跨平台,而在于PowerShell吸收了Shell的众多优点,同时进行了精心设计,从一个程序员的角度出发,PowerShell简单而又贴心的设计吸引着我去学习它并使用它。
下面列举一些PowerShell让我着迷的地方:
完善的帮助文档
学习Powershell应该从Get-Help学起,熟练使用这个命令将增加使用者的信心,掌握Get-Help的用法可以避免你把Powershell的每个命令都学习一遍。
下面用一个简单例子说明如何Get-Help,设想这样一个场景:
你想通过命令行查看所有进程,你第一个反应应该是用一个跟Process相关的命令来达到此目的,所以你可能会尝试执行:
Get-Command *Process
于是你得到了下面的列表:

再通过Get-Help命令来查看详细用法:
Get-Help Get-Process -full
就能得到Get-Process的详细用法和Examples,当然你还可以通过Get-Help Get-Process -Examples只查看Examples。

一致性
这种一致性体现在PowerShell的方方面面,他只有少许简单的规则,使用者只需要记住少量规则就能推断出代码的意图。
以Powershell的命令为例,只需简单一步即可弄清楚各种文件操作命令:
Get-Help FileSystem
下面截取了一段关于文件和文件夹的复制操作例子:

再看看有哪些命令用来操作文件:
New-Item #新建
Rename-Item #重命名
Copy-Item #复制
Get-ChildItem #列出所有文件
...
你能推断出移动文件和删除文件的命令吗?没错,他们分别是:Move-Item和Remove-Item。
读/写文件分别是:Get-Content和Set-Content。
想快速搞清楚New-Item的用法?使用 Get-Help New-Item -Examples。
也许你觉得这些命令相对于ls/cp.rm/rmdir/mv/cat有些繁琐,你可以使用Alias:
Get-Alias -Definition New-Item

所以New-Item和ni是等效的,不过在智能提示和Tab键的帮助下,New-Item表达的意图比起ni清晰多了。
你之所以能快速掌握PowerShell对文件的操作,一个重要的因素就是因为他的命令和参数遵循了一致性的设计原则,你可以通过复制文件命令Copy-Item推断出移动文件命令为Move-Item,你可以把时间花费在如何解决问题上,而不是去钻研各种稀奇古怪的命令和用法。
正如王垠所言,一门优秀的语言应该像中国象棋,只需少量规则就可以玩,或者说每条规则都很直截了当。反之有着复杂规则的语言像国际象棋,会有“王车易位”这样复杂古怪的规则。
提供了可以被flow的模块化机制
作为一个轻量级的脚本语言,一个可以被flow的骨架或者模块化机制是必要的,PowerShel提供了普通的脚本文件用来编写规模较小的脚本。
针对一个函数提供了一个模板,促使你写出更加规范的脚本:
function Get-PSFiles()
{
begin{
#...
}
process{
#...
}
end{
#...
}
}
同时提供了Module来编写模块化的脚本。使用Export-ModuleMember还可以决定某个函数是不是可以暴露给用户。
一个面向对象的Shell
不同于Linux下的Bash, 你需要熟练掌握字符串的操作方法, PowerShell是一个面向对象的shell,所有命令和返回结果都是基于对象的,这意味着你可以通过调用返回对象的方法来达到同样的目的。
通过管道符列出对象的所有成员:

由于返回值是一个对象,所以我们可以通过调用对象本身的方法、属性来达到操作字符串的目的。
基于对象还可以很轻松的做出排序、分组、过滤操作,例如按照属性vm排序就可以通过下面的命令来完成:
Get-Process | Sort-Object -Property vm
再想想你在Bash下如何实现这个功能。
鉴于PowerShell有着以上众多优秀的设计,我几乎没花费多久就可以轻松使用这个工具,这让我想起学习Linux Bash的经历,我曾经花费了大把的时间浪费在折腾各种稀奇古怪的问题上,把自己沉浸在别人设计的复杂的规则中,更郁闷的是好不容易记住的一些命令及其参数,一旦不去使用就会忘记。
开始我们的PowerShell之旅吧!
PsGet-Powershell中的包管理工具
PsGet本身是一个PowerShell的Module,PsGet可以通过两种安装方式,
- 方式一:直接在PowerShell执行这个命令
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex
iex是Invoke-Expression的别名,用来执行一段PowerShell脚本,所以上面的命令等价于:
Invoke-Expression (new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1")
而http://psget.net/GetPsGet.ps1返回了一段PowerShell脚本,脚本的大概内容是将PsGet的Module保存在PowerShell默认的Module目录。Module一旦被安装在PowerShell的缺省目录,就可以直接在PowerShell命令行使用该Module了。
- 方式二:既然能够通过PowerShell脚本来自动安装,就可以通过手动的方式完成同样的操作。该手动安装方法同样适用于其他无法通过PsGet管理的Module。
该手动安装过程包括两步:
- 从https://github.com/psget/psget/ 下载PsGet.psm1
- 把PsGet.psm1拷贝到PowerShell默认的Module目录
通过$env:PSModulePath命令得到默认的Module目录

PsGet安装完毕,安装几个常用的PowerShell工具来试试看:
文件夹书签-go
Install-Module go
此go非彼go, 这里的go是PowerShell中的一个书签工具,玩shell的痛点之一在于经常需要在不同的文件夹下切换,据我观察隔壁耍命令行的大叔90%都是cd,看看这个工具如何来帮助我们?
通过 gd -help 来查看go的玩法
通过gd label -add的方式把当前目录加入的书签中
C:\Windows> gd windows -add
然后在任意目录即可通过gd label的方式切入到书签所在的目录
C:\Works> gd windows
C:\Windows>
pscx工具集
Install-Module pscx
pscx是PowerShell Community Extensions的缩写,很明显这个工具集是对PowerShell的补充,提供了诸多命令:
Get-Command -Module pscx

构建自动化build脚本工具psake
Install-Module psake
psake是一个用来构建自动化build脚本的工具,他的灵感来源于Ruby中的rake,当然跟一些前端的工具诸如gulp也有点类似。利用该工具,用户可以通过简单且模块化的脚本方式来构建build脚本。
一个具有编译、打包.net控制台程序的脚本如下:
task -name Build -description "builds artifacts" -action{
exec{
msbuild ./ConsoleApplication1/ConsoleApplication1.csproj /t:build /p:Configuration=debug
}
}
task -name Clean -description "deletes artifacts" -action{
exec{
msbuild ./ConsoleApplication1/ConsoleApplication1.csproj /t:clean /p:Configuration=debug
}
}
task -name Rebuild -depends Clean,Build -description "rebuilds all artifacts from source"
task -name PackageZip -depends Build -description "produces a zip archive of the build output" -action{
dir ./ConsoleApplication1/bin/debug | write-zip -output app.zip
}
以上脚本定义了4个task,分别为Build,Clean,Rebuild,PackageZip。
通过下面命令来执行Rebuild任务
Invoke-psake -buildFile .\default.ps1 Rebuild

当然你可以在PsGet的仓库中找到更多的工具。
通过PSSession来执行远程命令
PowerShell容许你在远程机器上运行命令,这种方式有点类似于在远程Terminal上使用SSH。
Enter-PSSession -ComputerName 127.0.0.1 -Port 5985 -Credential richie
以本机为例,通过Enter-PSSession命令开启了远程命令行,进而以登录用户的权限执行PowerShell命令。

跨平台
2016年8月份,微软宣布开源PowerShell,并且发布基于dotnet core的linux和mac版本,github提供了不同平台的安装方式。
下图展示了如何在Mac下使用PowerShell,有没有觉得很帅气。

Azure PowerShell
Azure提供了一整套的PowerShell脚本来管理Azure,你可以使用Azure提供的PowerShell来创建和配置云服务、虚拟机、虚拟网络以及应用程序。
例如,你可以使用下面的命令登录你的Azure账号:
Login-AzureRmAccount
用下面的命令创建资源组
New-AzureRmResourceGroup
使用下面的命令来创建一台虚拟机
New-AzureRmVM
...
所有这些操作都等同于你直接操作Azure Portal。
PowerShell Desired State Configuration(DSC)
DSC是基于PowerShell的一套资源管理组件,用来帮助用户部署和管理应用程序。该扩展吸取了一些语言或者框架的设计灵感,旨在通过申明的方式来达到配置和维护应用程序环境的目的。
例如下面的脚本片段用来安装IIS以及创建一个Website
WindowsFeature IIS
{
Ensure = "Present"
Name = "Web-Server"
}
WindowsFeature IISManagement
{
Ensure = "Present"
Name = "Web-Mgmt-Console"
DependsOn = "[WindowsFeature]IIS"
}
xWebsite DefaultSite
{
Ensure = "Present"
Name = "Default Web Site"
State = "Stopped"
PhysicalPath = "C:\inetpub\wwwroot"
DependsOn = "[WindowsFeature]IIS"
}
DSC通过声明的方式来完成对资源的管理和配置,将使用者的重心从如何实现转移到达到何种目的。
总结
正如本文所说,PowerShell是一款经过精心设计的shell,也是对开发人员和管理人员十分友好的一个工具,本文总结了PowerShell的一些使用场景,感兴趣的同学可以继续学习如何编写PowerShell脚本,虽然PowerShell已经跨平台,但是目前阶段还只在Windows下发力,期待在未来,PowerShell能够在Linux和Mac上发展的越来越好。
爱上PowerShell的更多相关文章
- CentOS 7 上面安装PowerShell
看了文章 爱上PowerShell , 就想在CentOS 7上面试试PowerShell , 本文记录了在CentOS 7.2上安装Powershell 的过程. 首先我们要从github上下载最新 ...
- 在PowerShell中使用curl(Invoke-WebRequest)
前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper
剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...
- <译>通过PowerShell工具跨多台服务器执行SQL脚本
有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 .简单的几步搞 ...
- 利用PowerShell复制SQLServer账户的所有权限
问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...
- PowerShell 数组以及XML操作
PowerShell基础 PowerShell数组操作 将字符串拆分成数据的操作 cls #原始字符串 $str = "abc,def,ghi,mon" #数据定义 #$StrAr ...
- linux下mono,powershell安装教程
1简介 简单来说pash就是bash+powershell 2官网 https://github.com/Pash-Project/Pash 3下载fedora20---lxde桌面---32位版. ...
- Windows下PowerShell监控Keepalived
一.背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell来完成发邮件预警. 二 ...
随机推荐
- jquery+html三级联动下拉框及详情页面加载时的select初始化问题
html写的三个下拉框,如下: <select name="ddlQYWZYJ" id="ddl_QYWZYJ" class="fieldsel ...
- RPL协议介绍
RPL是IPv6 Routing Protocol for Low-Power and Lossy Networks的简称. 低功耗及有损网络(LLN)是一类内部链接和路由器都受限的网络,该网络下的路 ...
- jQuery小例
jQuery小例子 使用前,请先引用jquery 1,map遍历数组 2,jQuery对象与DOM对象才做元素和互转 3,prevall与nextall 4,jquery版的星星评分控件 5,jq ...
- Mysql高级之事务
原文:Mysql高级之事务 通俗的说事务: 指一组操作,要么都成功执行,要么都不执行.---->原子性 在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-->隔离性 事务发生 ...
- 国内外最全面和主流的JS框架与WEB UI库
当下对于网站前段开发人员来说,很少有人不使用一些JS框架或者WEB UI库,因此这些可以有效提高网站前段开发速度,并且能够统一开发环境,对于不同浏览器的兼容性也不需要程序员操心,有了这些优点,当然大家 ...
- HttpRuntime详解分析
HttpRuntime详解分析(上) 文章内容 从上章文章都知道,asp.net是运行在HttpRuntime里的,但是从CLR如何进入HttpRuntime的,可能大家都不太清晰.本章节就是通过深入 ...
- linux $ 类型变量 及Makefile 中 $ 类型变量的含义
Shell 命令中: $$: shell pid $!: pid of the last process running in shell $?: shell command return code ...
- Linux系统编程:dup2()重定向
对于Dup2 的理解: 源代码: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #inclu ...
- 通过反射生成SQL的例子
全文摘自http://www.cnblogs.com/g1mist/p/3227290.html,很好的一个实例. 反射提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑 ...
- Mac 下卸载 Graphviz
打算安装这个程序,但是听说这个软件在 Mac 上有问题,所以先记录下卸载方法. 方法一: 双击 pkg 文件后,当看到安装器界面时: 按 Command + i 打开安装包的信息窗口: 展开后可以看到 ...