可能大家看到这个标题要说我是标题党了,不过没关系了。这篇文章算是我的处女作,所以再怎么花哨我都不觉得过分。好啦,废话不多讲。
作为一个考试不喜欢写作文,工作不喜欢写总结,平时不喜欢写日记的人----我居然写blog了。工作10年之后我开始写blog了!!!!天啊我到底是哪根筋不对。
其实没有太多原因,本人平生所学驳杂,但是无一专精,实在惭愧。但是PowerShell又是自己在平时日常工作中用的最多的一种脚本语言,所以就选他了。但是在这里我不会系统的讲什么是PowerShell,语法是什么,只是给大家分享一些日常使用的小技巧,来帮助我们提高工作效率.
可能大家要问了,不是有Python吗?不好意思本人用powershell的时候Python还没有现在这么火。况且语言没有好坏,适合自己的才是最好的。
用Mac/Linux的大神们出门右拐。
其实我个人对PowerShell是有感情的。为啥?因为他简单上手快,Windows原生的。而且自从PowerShell开源之后发展迅速,功能强大,扩展性好。而且在Windows平台下的Server管理异常的强大,简直就如同Linux下的Shell。
点击开始->Windows PowerShell ,就打开了一个PowerShell的运行环境
1 按Windows->输入PowerShell
2 按Windows+R->输入PowerShell
来看看我们的系统里面都有那些程序在跑
Get-Process
啊?什么?
你们说这不是Hello World 别天真了,都这么时代了还要真的来个Hello World?
来吧来吧
Write-host "Hello World"
言归正传,我们再来看看有几个powershell进程
get-process | ?{$_.Name -eq "powershell"}
符号 | 含义 |
---|---|
| | 管道操作符 |
? | 相当于命令 where-object 设置查询条件 |
$_ | 自动变量 |
-eq | 比较运算符 |
这个管道操作符可以说简直是PowerShell的艺术魅力所在。在PowerShell里面一切输入输出皆为对象(区别与其它的脚本语言),任何对象都可以往管道里面塞。
那么何为对象(单生狗请忽略)?何为管道?
对象我不解释了,大家都是老司机了谁有没有点面向对象的sense是吧。这个特点其实是基于高级语言而来的,因为PowerShell是基于C#开发的,而C#是强类型的高级语言,一切实例皆为对象。所以PowerShell也继承了这个优点。所以其实PowerShell其实是可以和C#无缝集成的。那么使用过C#的老司机要恭喜你了,完全没压力使用PowerShell,完全不需要什么学习成本。分分钟就能学会。
管道呢?字面意思大家都能理解。一根管子嘛,这头进去,那头出来。但是真正的艺术不在于一根管道。
想象一下我们把多跟管子用接头链接起来,然后把生产原料(对象)从管子的一头放进去,会从管子的另一头出来什么?哈哈当然还是生产原料(对象)这一点很重要。你们可能要骂我了,这说了等于没说。
我们再想象一下如果链接管子的不再是接头而是各种各样的生产设备,那么另一头出来的有可能是美酒,有可能汽油,有可能是牛奶或者奶粉。就像下面这张图。没错这才是管道艺术,你不需要关心里面发生了什么,只需要用管道链接你的生产设备(处理程序)那么就能创造出你想要的艺术。
那么PowerShell也是可以这样的,我们可以用多个管道符来链接不同的处理程序,然后最终输出我们想要的结果。
比如:
Command-1 | Command-2 | Command-3
不过瘾?来看个稍微复杂点的
Get-ChildItem -Path *.txt |
Where-Object {$_.length -gt 10000} |
Sort-Object -Property length |
Format-Table -Property name, length
还可以简化一下
Get-ChildItem -Path *.txt | ?{$_.length -gt 10000} | sort -Property length | ft -Property name, length
是不是碉堡了?
如果要实现同样的功能,用C#或者其它高级语言的代码量是可以想象的。当然我们不用关心这段代码的实际意义哈:)
关于管道符的更多官方解释请移步这里。E文嘛,没关系,微软貌似可以直接转中文的,如果觉得转的不好看可以来找我。 当然观看文档的时候请注意你自己使用的版本。
? – 实际上他是 where-object 的别名,就是为了图方便。当然你也可以把它设置成其它符号,但是建议不要有这样的骚操作。因为别人不知道,你也可能忘记,在将来的某一天你一定会说 我艹。
那么这个东西有啥用?你在数据库里面的where有啥用,这个就有啥用。就是要在茫茫对象中找到你的那个它,然后用管道送到下一站盘它。上一个管道符已经演示了,这里就不赘述了。
PowerShell 有很多保留的自动变量。$_ 就是其中之一。啥是自动变量呢?就是在你的脚本运行过程中运行环境自动申明和赋值的一些变量,在合适的情况下直接引用就可以了。但是还是要注意上下文。
$_ 在管道操作过程中使用的最多。
比如下面这段代码:
Get-ChildItem -Path *.txt | %{Write-Host $_.FullName}
输出如下:
那么看到这里的你想象一下下面这段代码的第二个 $_ 是什么类型的呢?
Get-ChildItem -Path *.txt | %{Write-Host $_.FullName} | %{Write-host $_.length}
老司机们是不是是个编程语言都有比较?如果没有,那就是我孤陋寡闻,请不要吐口水。
那为啥PowerShell要高些这么奇怪的运算符呢?不是C#无缝集成吗?因为PowerShell里面好多运算符都被保留作他用了,确切的说是Windows本身也有好多保留的符号。比如 &,> , < , ^ ,| 至于这些符号在Windows里面有啥特殊含义,不属于本文讨论范围。
所以自己挖的坑跪着也要把他填完。于是PowerShell搞了一套奇怪的逻辑运算符,比较运算符, 算术运算符。
下面列几个跟本文相关的几个比较运算符:
你掌握的语言已经足够强大,没有发挥出应有的作用可能是姿势不对。
哎呀不行了,第一篇blog写的我两眼发花,高龄搬砖家真的伤不起。共勉,共勉。
晚安了各位!
我会定期更新PowerShell相关的系列文章帮你提高搬砖效率。
有什么需求的也可以直接私信我,我会把我所知道的分享给大家。