忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1598 | 回复: 3

[学习共享] ps第7课:powershell到底有何优势,为什么要学? [复制链接]

论坛徽章:
0
发表于 2017-07-31 12:26 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-07-31 17:01 编辑

为什么要学powershell?
                ---poweshell优势和现状总结2017

------------前言------------
1 有人问道“为什么要学powershell?” “到底哪好?” 本文主要给不清楚powershell到底哪里强,哪里弱的人,指一条路。
2 不想吹,想实事求是。powershell不是没有缺点。欢迎爆料powershell缺点。为了避免主观,我对ps的优点尽量带上论点,和论据。也希望你能如此。别在我面前拿不出证据!
3 我先说powershell的缺点:
目前linux中powershell中主要缺点是命令少。在我看来,比win少50%---60%
但,常用的命令也就20%,命令少的缺点,可以用linux命令来弥补。
对于会linux命令和脚本的人来说,这个问题并不大。他们不担心没有对应的ps命令,他们更担心老shell命令是否能用。

------------正文------------

------语法,命令,数据类型小节-------
1语法【一字记之曰:简】。容易学,容易改。语法简单标准,太简洁,容易看懂。
比bat,bash强不少。虽说也已经出了10年了,但还算新语言,新语言语法,必然比比老的好很多。

2面向对象【一字记之曰:强】。
2.1本地ps命令之间,ps函数之间,管道之间,基于ssh的远程【传对象值!】而不是字符串。甚至和数据库,图像接口之间,对象直传。
管道两边能传对象,就是创举!!!请看:
某个win中的cmd命令 | cmd管道 | 某个win中的cmd命令    #管道两边传字符串
python命令 | cmd管道 | python命令 #管道两边传字符串
java命令 | cmd管道 | java命令 #管道两边传字符串

某个linux的命令行命令 | bash管道 | 某个linux的命令行命令    #管道两边传字符串
python命令 | bash管道 | python命令 #管道两边传字符串
java命令 | bash管道 | java命令 #管道两边传字符串

win中的ps命令 | ps管道 | win中的ps命令    #管道两边传对象
linux中的ps命令 | ps管道 | linux中的ps命令    #管道两边传对象
结论:
管道中传输的对象,从粒度上来讲,是比较大的东西,比字符串大很多。对象中能容纳的信息,比字符串丰富很多。当然也慢很多。
如果说字符串是一粒沙,那么对象就是一块板砖。有板砖后拍人很易,用沙太难。没有对象,就别再勉强。
此乃面向对象管道之妙。

2.2面向字符脚本,必须要扣字符串,这是癌症。而面向对象脚本不用,完成同样的功能太省事了。如curl和Invoke-WebRequest
当然,现在linux中的ps命令,还不全,将来会越来越全。
为什么会有这些差别?因为属性。
2.2.1属性只有必要的数据。
2.2.2字符串带有格式,空格tab等。而属性没有。不会产生对不齐的问题。
此乃面向对象属性之妙。

2.3使用对象的方法,来进行拆分,筛选,比烧脑正则简单太多。
用对象的方法,判断ip地址是否合法:
$ipgroup = "192.168.0.1","1451432309","::1","","fff1::101","123.456.123.123","123.43a.1.17","2001:0000:1F1F:0000:0000:0100:11A0:ADDF","1.2.o.3","123.233.4"
#将返回true 或false, 倒数第一个合法,那是因为会自动扩展成123.233.0.4,倒数第二个不是零,剩下都简单我就不说了。
foreach ($temp in  $ipgroup )
{
  [system.net.ipaddress]::tryparse("$temp",[ref]$null)
}
此乃面向对象方法之妙。

2.4支持csv,xml,json等。支持的数据类型比bash多。
2.5用ps时可选择内存对象(如stringbuilder,arraylist,各种集合)作为缓存。
多线程还可以选择【线程安全型变量】,性能佳。丰俭由人,更灵活。而awk是个黑盒,无法操控。

3有where-object,group-object。分组筛选功能强,不用自己编码,这条算吗?

4请问第三方shell模块,扩充容易吗?
这种第三方模块,貌似shell从数量,质量,安装方便程度,
都不如py,perl吧?我看现在也不如powershell。

类似于python的【图书馆】。第三方模块,有powershell【画廊】。是微软ps官方库。 https://www.powershellgallery.com/
安装模块方法是:install-module xxx。
升级模块方法是:install-module xxx。
ps还有一个兼容的,巧克力模块仓库。
还有一个微软脚本中心。
不过目前适用于linux的,并不多。随着时间的推移,会逐渐解决。

5兼容linux shell命令。旧的命令,管道,正则,awk,sed应该99%兼容,和在bash中运行,返回的结果一样。


------文件编码 小节------
linux中就别用中文?即使在linux中,ps对中文的支持也和win中一样。你敢不赞?
1引号:支持中文单双引号,作为引号。
2空格:设置为空格,tab键,全角空格,都能正确运行。----bash无法识别中文空格,即全角空格。
3支持中文函数名,中文变量名。我觉得是对中文,支持最佳的脚本语言。
4 findstr,grep都不支持编码。select-string有-encoding参数。凡是和编码,中文相关的问题无忧。
5 【回车符】ps支持cr,lf,crlf。部分linux命令有【回车符】支持不全的问题。
结论:
.net,java对中文支持好,强过python。shell最差。由于java现在还没有shell,powershell是对中文支持最好的脚本。

------linux小节------
1跨平台。
2问:为什么说powershell的转义,比shell要好?比python好?
答:
2.1 powershell是面向对象的,属性返回的是直接可用的数据。比面向字符脚本语言(bat,shell)需要扣字符串的情况要少很多。
天生遇到【需要转义的内容】就少。
2.2 字符串查找替换,powershell中有不需要转义的,.net类中的方法。如:
[string]$a = 'abc\\def'
$b = $a.replace('\\','当')
#返回:【abc当def】
判断ip是否合法,可以用IPAddress类中的TryParse()方法。
总之我的建议是,尽量多用.net类方法,尽量少用正则,或者只用简单正则。


2.3 powershell内部用【`】作为转义符。【`】比【\】更不常用,作为转义符冲突少很多。
2.3.1 在编写数据库的脚本的时候,【`】的冲突就多了。
如【`table`】 会和【`t】冲突,如【`biao`】会和【`b】冲突,后来我用【`表`】解决的。
2.3.2【`】比python的【\】强。python需要在路径前面加上r,如r'c:\xxx\xxx'。太不爽啦,ps没这问题。


2.4 ps字符串查找替换,有正则引擎,兼容linux,也是用【\】作为转义符。
不过,有专门的字符串转义函数【[Regex]::Escape()】,先转义后进行查找替换,代码可读性高。
$转义前的原始字符串 = '\+\&*|]'
$转义后的字符串 = [Regex]::Escape($转义前的原始字符串)
-------------
脚本例子
[string]$a = 'abc\\def'
$转义前的原始字符串 = '\'
$转义后的字符串 = [Regex]::Escape($转义前的原始字符串) #【\】--->【\\】
$b = [Regex]::replace($a,$转义后的字符串,'当')
$b #返回【abc当当def】
-------------
2.5 bash和awk,各自有for,各自有转义。组合起来,很容易甲影响乙,甲吞掉乙。
遇到【'】,【"】,【\】,【*】也很容易出问题。                                                            '
这就像穿了两层秋裤,你拉动一层,另一层也跟着动,你需要费脑筋去关注他俩的兼容。
此乃癌症,很难解决。
但是捏,这问题也是可以在一定程度上避免。这需要写shell的人改正臭毛病。
【把awk代码单独放在.awk文件中,而不是放在命令行中】
powershell没有此问题,放在命令行,放在脚本中,没啥影响。

3 linux中有数据对齐的癌症,ps中没有,原因上面已经说了。
而且经format-table输出的表数据,中的字段,可以自定义对齐。(居左,居中,居右)


-----云+虚拟机小节------
1 azure,亚马逊aws,支持powershell。
2 vmware vsphere,haper-v,支持powershell。
3 配置管理有dsc,模块多。目前缺点是:支持azure的多,支持win的多,支持linux的少。


------性能小节------
1 win中性能比python好一点点。
2 有多线程,计时器。将来会有workflow多进程,使开发简单高效。
其主要优势是用多核心增加cpu密集任务速度,并少用内存。当然缺点是,脚本编写难度增大。
3 据说linux上.net的性能优于 win + .net 4.7。



------开发小节------
1 msdn上的.net类,有中文手册。
2 有vscode,ise,powergui。中文ide,三剑客组合,开发,调试高效。极大提高脚本编写速度。
3 颜色漂亮。
4 ps的语言内置的,调试功能特别强,算吗?

------powershell VS python小节------
问:shell和python谁更强大?
答:
各有所长,可以互补。但是却无法互补。下面详述。

问:为什么说linux版的powershell,更适合于运维人员用来写脚本?(比linux版python)
答:
1 python有的面向对象功能,linux版powershell都有。

2 python没有命令行。或者说,只有【能运行内部功能函数代码,没有运行外部命令的】假命令行。
2.1 python无法成为ssh默认终端,相当于shelld守护进程。linux版powershell可以。
2.2 python中使用shell命令(awk,grep等),非常麻烦。需要增加很多py语法和代码。还有各种import。
linux版powershell运行awk这些命令和bash一样。没有这些import。

3 python没有管道。让n个【命令行程序】之间传值,非常麻烦。需要增加很多py语法和代码。
linux版powershell有管道,运行awk这些命令和bash一样。
如果把awk,powershell,perl,python都放在管道中,的任意管道位置,让它们基于管道接力处理任务。即
awk命令|powershell命令 |python命令|perl命令 |任意前四种命令
我认为,只有python管道命令编写起来最麻烦。

4 python有版本2,版本3不兼容的癌症!问题。linux版powershell没有这样的问题。
4.1 这些问题包含编码问题。
结论:
【py命令库】和【shell命令】死不往来,基本无法互补。而linux版ps就不同了。
python中用中文,各种小问题。需要注意的地方很多。


------win小节------
1 依靠win7,未来1---2年内的win10,的装机量。可以非常通用。依靠此装机量,我认为只有powershell才配称脚本大帝。
2 win5.1的ps语法,和linux中的ps6.0语法。大概97%---99%相同。你基本可以在win中编写,并实验脚本。
而win、linux中,ps6.0语法比5.1还要强一些。性能也要好一些。

------总结小节------
1旧有的linux命令,在特定条件下,已经做了抽象。这些命令已经做到最简。
如:
(有一些,抱歉不熟shell,未能举例)

这时候,linux命令比ps命令【简】了。
这时候,你应该用这些linux命令,而不用ps。
2由于命令缺失,powershell现在还不是太强,但会越来越强。
2.1也许,这也不是缺点,正好很多人,有也不想用ps命令,想用部分旧有的、熟悉的、shell命令。
3语法没问题。建议以powershell为主shell。
4旧有的命令无需改变,旧有的脚本无需重写,可以用bash xxx.sh调用。

5在linux中,有许多好shell脚本,也有许多好py脚本。但他俩老死不相往来。这样并不好。
假如说python是天猫,shell是京东,那么powershell就是天京。假如说shell是肉,python是饼,那ps就是肉夹馍。
很多招聘要熟悉shell,py。那么你熟悉ps就相当于熟悉他俩。用一个就相当于用俩。
当然啦,取2之糟粕易,懂2之精华难。

另外我想强调的是:
虽然ps在win,linux通用。可以在win中实验ps命令。但
只想教powershell for linux,所以请你一定注意,你有如下,能安装ps的linux发行版:

问:目前哪些版本linux能安装上powershell?
答:
◦MAC OS X 10.11
◦Ubuntu 14.04/16.04/Debian8.x
◦CentOS 7.x/RHEL 7.x
◦open SUSE 42及以上
◦LINUX docker 容器
◦Arch Linux (archl inux 没有版本号)
◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit
从powershell 6.0 beta4版本开始,支持:
• SUSE Linux Enterprise Server 12 SP2
• Debian 9
• Fedora 25 and 26 ---测试通过,使用完全正常


论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-07-31 13:08 |显示全部楼层
回复 1# 本友会机友会摄友会

你时间不多了......

http://bbs.chinaunix.net/thread-4263951-1-1.html

论坛徽章:
15
巨蟹座
日期:2014-11-20 23:04:5215-16赛季CBA联赛之四川
日期:2016-11-21 00:16:50操作系统版块每日发帖之星
日期:2016-07-28 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-25 15:36:04操作系统版块每日发帖之星
日期:2016-02-12 06:20:002015亚冠之西悉尼流浪者
日期:2015-08-28 14:48:322015亚冠之平阳省
日期:2015-08-19 14:54:162015亚冠之武里南联
日期:2015-07-07 10:49:112015亚冠之城南
日期:2015-06-22 10:15:002015亚冠之山东鲁能
日期:2015-06-18 18:03:442015亚冠之阿尔萨德
日期:2015-06-18 08:04:59操作系统版块每日发帖之星
日期:2015-06-10 22:20:00
发表于 2017-08-09 20:05 |显示全部楼层
powershell函数定义和mfc一路货色,又臭又长
来自安卓客户端来自客户端

论坛徽章:
0
发表于 2017-08-10 11:00 |显示全部楼层
cu也有很多货色
拿不出论据,或者说完观点就跑。观点有时候,也说的不清不楚。真的是这样啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP