谈谈 PowerShell
坑边闲话:万事万物,有始有终。直从萌芽拔,高自毫末始。所谓的 Shell,无非是应用程序与操作系统内核进行交互的一个中间程序而已。我本人玩电脑也有很久一阵子了,最开始接触到的就是 Windows 7 操作系统,当时 Windows 7 上市不久,我在那台 20 英寸的液晶显示器上看了很多 PC 的知识。但是我第一次接触 Shell,却是在 Linux 上。
- 知乎原文
- Status: 已搬运,待校对
Linux 上最常用的是 Bash,这是一个对于 Bourne Shell 的再造版,完全免费、开源,而且很好用。而 Linux 上的 zsh 也不错,而且很多提示功能非常贴心。就这么一个好用的 shell 程序,自然身受很多程序员的喜爱。玩电脑怎么能不搞点自动化呢?
想想有哪些东西需要自动化?我列举几个:
- 写了一个程序,要用来编译、测试、测试完再清理编译的产物,这个时候需要一个自动化的操作
- 用 LaTeX 写了一篇论文或者文章,希望能自动进行编译,然后自动清理产生的
aux
、log
等中间产物,只留下编译产生的 PDF 文件 - 喜欢一个网页或者博客,希望及时收到这个网页的更新,这个时候你需要一个程序,自动地每隔几秒、几分钟、数小时发起一次 HTTP 请求,然后获得页面中相应部分的更新情况(比如淘宝页面,价格是否变化了?)
- 自己的系统装了很多软件,希望能够批量进行更新情况检查,一旦有部分软件出了新版,就自动联网更新。
- …
上述的几个情况比较特殊,但是确确实实贴近我们的生活。最初的 Windows 系统,并不支持这种内建的自动化操作,你能想到的也就是 cmd 命令行。而这个命令行确实非常难用,让一些追求软件美感的人望而却步(嗤之以鼻)。
1、何以 UNIX/Linux·
UNIX 是从实验室里走出来的操作系统,小巧、高效、简洁、开放。而 Linux 作为 UNIX 的净室再现,也相应地具有了 UNIX 的各种优点,也兼容 UNIX 系统的很多程序。等到把 GCC 移植到 Linux 之后,Linux 的增长曲线开始发力,因为一旦有了某个平台的编译器,我们只需要把其他平台的源代码拿过来编译一遍,就得到了适用于新平台的软件。当然,前提是新平台符合 POSIX 标准。
那么为何 bash 在 UNIX 世界里这么受欢迎呢?我认为有以下几个原因。
- 使用者生活在一个自由的环境里
- 使用者的知识水平比较高,众所周知,BSD 版本的 UNIX 是在伯克利大学流传开来的,那里的师生什么水平、什么审美,相信大家有目共睹
- UNIX 的伪终端非常好用,以 macOS 为例,你可以直接在 Terminal 里面,用键盘复制、粘贴,而其他诸如 Linux 自带的终端也很好用
- Bash 的开发很有趣,相关的程序很给力,比如 GNU 软件,awk、perl、sed 等程序,非常适合命令行下操作字符串
- 很有美感
以上种种原因,使得 bash 脚本在 UNIX 世界里广受欢迎,你只要稍加练习,就会爱上这门语言。
但是,PC 装机份额最大的 Windows 用户,在这一方面却始终处于水深火热之中。怀抱着丑陋的 cmd,用着蹩脚的复制、粘贴操作。更重要的是,很多 Windows 用户并不知道竟然可以自己写脚本来控制自己的电脑,解放自己的双手!
2、准备好了吗?PowerShell·
2.1 粗略介绍一下 PowerShell 与 bash 的区别与联系·
现如今 Windows 10 平台的 PowerShell 是 5.0 版本。支持 cmdlet. 所谓的 cmdlet 就是相当于微软 .Net 平台的一套小程序,命名为 Verb-Noun
. 举个例子说明一下什么是 cmdlet,你在 UNIX 上输入命令创建一个空的文件夹:
1 |
|
在 Windows Powershell 里面就有对应的 cmdlet:
1 | # 创建一个名为 Test_dir 的文件夹 |
UNIX 这里面的 mkdir
就是一个小程序,你确实可以在 UNIX 上找到一个名为 mkdir
的可执行程序。但是 Windows 却不这么认为,Windows 认为用户可能误删某些小程序,导致你无法再正常使用 Windows 的 Powershell,于是微软的工程师,直接把需要用到的“小程序”集成在一起,禁止你直接访问、删改。
bash 是支持管道的,一个进程的输出,可以当作另一个进程的输入。换句话说,Linux/UNIX 是一个文本控件,一切皆文本,文本字节流是这个空间里的对象。
1 | Get-PSDrive | ?{$_.Free -gt 1} | %{$Count = 0; Write-Host "";} { $_.Name + ": Used: " + "{0:N2}" -f ($_.Used/1gb) + " Free: " + "{0:N2}" -f ($_.free/1gb) + " Total: " + "{0:N2}" -f (($_.Used/1gb)+($_.Free/1gb)); $Count = $Count + $_.Free;}{Write-Host"";Write-Host "Total Free Space " ("{0:N2}" -f ($Count/1gb)) -backgroundcolor magenta} |
Get-PSDrive
是一个小程序,也就是 Power Shell 里的 cmdlet. 上述命令很复杂,你可以通过视频进行学习。上述的文件写进 bat 脚本里,双击脚本运行,会得到一个类似的输出:
1 | C: Used: 138.99 Free: 98.85 Total: 237.84 |
cmdlet 约等于 UNIX 里 /bin 下面的小程序,只是你在文件浏览器里找不到它而已。除此之外,PowerShell 的使用,与 bash 差不多(我可不是说两者的语法差不多!)。
2.2 高傲的微软向 UNIX 世界屈服了吗?·
微软绝不是因为“他们有,所以我们也要有!”而创立的 PowerShell.
微软主要是因为 Windows Server 的管理问题而开发了 PowerShell 这个东西。所以从这里你也应该看出来了,微软相当于间接承认,没有 shell 的一个操作系统很难用。
如果把 .Net 平台提供的开发 API 称为生肉的话,那么 PowerShell 就是经过烹调的熟肉。虽然生肉不好下嘴,但是你可以经过自己的烹调,获得最大的自由度。熟肉虽然好吃,但是你只能换个花样切一切再吃,没有什么自由度,想换个口味?几乎没可能。
三、PowerShell 好用吗·
很好用。
之前我一直对微软的 Windows 系统的开发能力很怀疑,我有个 MacBook Pro 15,特意配了 32GB 内存来搞开发,用起来很爽。但是哪怕我的 PC 机配置很强大,我也很不想用它来开发,我一般都是再 WSL 里运行我在 Mac 上写好的程序。但是最近和小伙伴们聊起来,大家对 PowerShell 还是赞不绝口的。
所以我承认,我对微软有偏见了。
如果你没有对一个系统做深入了解,你就不能武断地认为这个系统很难用。一眼看上去就很美,大概率是很美;一眼看上去不好用,大概率是因为你不够了解(**比如 Vim **)。
最后谈谈 PowerShell 哪些地方好用吧:
3.1 良好的自动补全功能·
不得不承认,PowerShell 的自动补全非常好用,可以忽略大小写进行循环匹配,bash 的匹配,如果出现前缀对应着多个可能的命令,就会列出来让你选择(除非用插件),但是 PowerShell 可以随着你按 TAB 进行自动匹配下一个可能的选项。这点仁者见仁智者见智吧,Power Shell 如果提示太多一时找不到,还得删掉已经提示的,然后重新输入,这点也很烦人。
不过,总体来说很优秀。
3.2 对于管道支持良好·
这一点配合 Power Shell 的面向对象特性特别有用。喜欢的自己钻研的时候注意一下。
3.3 支持环境变量·
1 | PS C:\Users\newton> $env:PATH |
3.4 可以发挥 .Net 平台的巨大优势·
结合 Office,C#,非常好用。
结束语·
如果不是对 Linux 有着绝对依赖,即你知道自己哪些需求绝对离不开 Linux,那么不妨试试 Powershell,这个真的很不错。微软敢以 Power 之名,必然是有着相当的自信。