Windows Invoke-WebRequest
1,Get请求:curi -URI https://www.google.com
会发现content内容被截断了。想要获取完整的content:
curl https://www.google.com | Select-ExpandProperty Content
2,添加header
-Header @{"script" = "application / json"}
3,指定method:
-Method Get
4,将获取到的content输出到文件:
-OutFile ' c:\Users\rmiao\temp\content.txt '
5,表单提交:
For example:
$R = Invoke-WebRequest http://website.com/login.aspx
$R.Forms[0].Name = "MyName"
$R.Forms[0].Password = "MyPassword"
Invoke-RestMethod http://website.com/service.aspx -Body $R
6,内容筛选
$R = Invoke-WebRequest -URI http://www.bing.com?q=how+many+feet+in+a+mile
7,一个登录实例:
#发送一个登陆请求,声明一个sessionVariable 参数为fb, 将结果保存在$R
#这个变量FB就是header.cookie等集合
$=curl http://www.facebook.com/login.php -SessionVariable fb
$FB
#将response响应结果中的第一个form属性赋值给变量Form
$Form=$R.Form[0]
$Form.fields
#查看form
$Form | Format-List
#查看属性
$Form.fields
#设置账号密码
$Form.Fields["email"] = " [email protected] "
$Form.Fields["pass"] = "P@ssw0rd"
#发送请求并保存结果为$R
$R=Invoke-WebRequest -URI (" https://www.facebook.com " + $Form.Action) -WebSession $FB -Method POST -Body $Form.Fields
#查看结果
$R.StatusDescription
由于群友要做powershell培训,所以帮写了个ppt的大纲。请各位群长老抽空, 审校、增加【认为应该给入门人学的】内容。 可以去,QQ群号=183173532,的群文件共享,可下载最新版【powershell入门教程】。 教程目前是0.8x版,版本会持续更新。
ps1赛屠龙,宝刀百炼生玄光 ------《倚天屠龙记-第三章》· 金庸
win,linux通用的,脚本【速成大师①】的路上,并不拥挤。知道powershell简单强大,并肯坚持学的人,并不多。 学过c#、asp.net的人,由我教,需要2个月左右,成为win,linux通用的,powershell脚本大师。 学过c#、asp.net的人,努力自学,需要2---4个月左右,成为win,linux通用的,powershell脚本大师。 菜鸟由我教,需要6个月左右,成为win,linux通用的,powershell脚本大师。 菜鸟努力自学,需要12个月左右,成为win,linux通用的,powershell脚本大师。
某个运维哭诉道: 开发天天甩锅给运维部门,而运维部门甩不出去。老板经常骂运维经理。搞的他要经常请开发去吃、去嫖。
还有这种事?真是吹牛不上税的家伙。 和开发搞好关系是必要的。但是捏,有时候运维开发是对立的。 这时候就要打铁还需自身硬!你需要linux版powershell这把屠龙刀。
目的:减少自己的锅。并把别人的锅还给他!
1没有什么锅,是监控+报警+日志+定时+脚本搞不定的。你应编写全系列,一整套,n多脚本组合,来实现智能操控。 2监控软件都能调用脚本。zibbix+ps脚本。nagios+ps脚本,技能要精通。 3如果遇到centos6,无法安装ps。就在win上,或win虚拟机上,通过ssh,远程发送linux命令。 4如果一台ps怕坏,就两台。【命令发送机(或虚拟机)】也可以高可用。从ping主,探测主是否活即可。 5网络尽量稳定,有一定的冗余。 6用主流软件,别用太老的。用稳定版软件,别用太新的。 大版本落后最新版2个版本。小版本最新。如php。最新版=7.2.x。上一版=7.1.x。上二版=7.0.x。那么就用7.0的最新版:7.0.31 如果你精通这个软件,大版本可以落后最新1个版本。
----------第一章 windows脚本历史--------------
1 第一代脚本bat。从win95,win98开始---------到2008年左右结束。 特色:面向字符的命令,有命令行,管道。 2 第二代脚本vbs。特色:只有函数,传值,调用。 3 第三代脚本powershell。 从2012年开始,命令全面进化到面向对象。如tasklist和get-process 就是重复造轮 特色:面向对象。继承了前两代脚本的优点。
从2016年秋开始,powershell成为开源免费软件。逐渐支持linux,mac,arm等。 从那时起,ps属于开源社区,不属于微软。微软只是源头,和主要贡献者。 从那时起,ps不但可用于win,还可用于各种linux。简称win,linux,mac不败。
问:powershell有什么杰出特色? 世界上唯一的,管道两旁的命令支持对象。即 面向对象的命令1 | 面向对象的命令2 世界上唯一的,经ssh,psremoting远程传输对象。而不是远程传字符串。
windows和linux不同: 在win上的powershell脚本中, 支持cr,lf,crlf回车。支持多线程,多进程并发。 嵌入【文本2声音】很容易,“报告队长,磁盘已满”。 嵌入图形界面很容易。(当,弹出界面,要求输入用户名,密码,单选,多选等。)这些是linux脚本眼馋嫉妒的。
powershell和python不同: powershell中使用中文很容易。中文脚本名,变量名,注释。中文单引号,中文双引号。 自动识别gbk,utf8,unicode编码。管道支持对象,这些是python脚本眼馋嫉妒的。
问:为什么不学shell? 1 shell太老了。语法上有各种小小的问题。(例如:详见shell十三问的for篇) 2 shell不是面向对象的,功能不强。 3 shell的正则,学习曲线陡峭。复杂的正则,很容易出错。 实际上ps和py类似。都是用【简单的对象方法】,来实现【复杂正则】的功能。但是呢,shell没有对象,也没有方法。 4 常用外部shell命令还是要学,要会的。 5 java在发展,jshell,java12快出了。 .net在发展,.net3快出了。 python在发展,py37快完善了。 perl不怎么发展,排名蹭蹭跌。 bash和shell命令,基本不发展。shell已经完美了么?shell中连布尔型变量都没有。 6 shell中的坑,幺蛾子,隐藏的问题太多。powershell没这种问题。 set +o noglob touch /tmp/a1log A="/tmp/a*log" ;echo $A #返回 /tmp/a1log
B='/tmp/a*log' ;echo $B #返回 /tmp/a1log
问:如何看待bash,及linux shell脚本将来的地位,命运? 问:powershell在linux中的前景如何? 就好像【气泵射钉枪】必将取代【锤子】一样,先进生产力必然代替落后的。 就好像面向对象的powershell,必然取代面向字符的bat那样。 powershell发展成熟后。以bat,bash为代表的,上一代面向字符串的脚本语言,面向字符串的命令,难免被边缘化。 过几年后,开机启动脚本,特简单的脚本中,或许还残留有bat,bash,字符串命令的身影。
问:为什么不学python? py很强大,我承认。但在运维方面,py不但不强大,还有硬伤。正因为有下述硬伤,所以我们运维,还是用shell多,用py极少。
1py中,没有shell命令行。或者说从.py中运行shell命令,接收返回值麻烦。而ps命令行,不光可以运行ps命令,还能执行shell外部命令。如find,grep等。 2py脚本,不支持管道。或者说【两个.py】通过【shell管道】传值,需要写很多额外的py命令。并且只能传字符串。而ps天生支持【管道】传【对象】。 比如写py管道脚本,需要import,open,read,close。而powershell,bash,使用管道数据,不需要这些步骤。 3ps中有,基于sshd的,远程命令行。支持客户端,服务器之间,直接传输对象。py不行。或者说ps远程的【序列化/反序列化】是透明的。 4ps中,用中文脚本名,变量名,注释,容易。而py3在centos7,ubuntu1804中不是默认。 5python人太贵,运维的工资只能招到py低手。py高手有更挣钱的方向,【高富帅不愿入穷坑】写运维脚本。 即便写出来。也很繁琐。 6阿里云命令行工具CLI,为Go语言重构版本,如果您想使用原有的Python版本(不推荐,已不提供支持) py的远程ssh远程一堆坑 : https://zhangge.net/5122.html py的sftp一堆坑,不如ps+winscp模块和命令 : https://zhangge.net/5121.html 8和系统,运维相关的,py不行。尤其是win环境下。 9装机量的话。linux都带py,win都带ps,可以说不相上下。而win机子数量远多于linux服务器,可以说ps脚本更通用。 10生命苦短我用ps1,不用python。ps比py语法简单。比如没有三目,没有装饰器。
问:为什么不学shell + python? linux中,shell,py各有缺陷,谁也不能一统【运维江湖】,对不? shell就是鱼,python就是熊掌。 鱼就是鱼,是鱼就有腥味,和鱼自带的其他各种特色。熊掌也是一样。 即使你已经精通108种做鱼的方法,256种做熊掌的方法,你也做不好鱼+熊掌。 因为它们俩之间互不兼容,你作为厨师很难把它们结合起来,(见上面的为什么不学py的第2点) 你是运维,不是bash+python软件的开发者。你是厨师,不是纳米基因科学家。你做不到把鱼和熊掌结合起来,尽取优点。 就算你是比开发还牛的运维,强制把它俩结合在一起了,能工作了。最后发现,费了很多力,但是味道不好。
在powershell一统江湖之前,现在企业实际使用中,需要用到shell,和python。基本都是从shell中调用py,很少有反过来调用的。 所有这些开发人员,都在忍受: 1shell的管道不能传递对象问题。 2py不能收发管道问题。或需要编写复杂py语句,支持管道。 3需要学习2种完全不同的语言。
问:为什么不学ansible? 对比没意义?蠢材才这么想。我告诉你win,linux不用对比,它俩完全一样,你信么?
1 ansible和powershell dsc 是一类东西。依赖模块,有模块好,无模块傻眼。 模块,是ansible的核心内容。但是这些模块都是二手的,比如docker,k8s官方的命令是一手的。 ansible在我理解,就是二手模块大集合。
2 依赖模块,导致ansible比shell,比ps,繁重。 假如说shell是自行车,灵活,功能基本够用。 那ansible就是坦克,去楼下小卖部买包烟,要给坦克加油,预热,然后开坦克去。 总之脱裤放p,做简单的事,反倒繁琐。 2.1 ansi常用的功能,还要学习模块。增下了学习成本。 ansible的fetch,从远程主机下载文件。(不能下载目录) ansible的解压功能,对targz貌似有问题。 总之功能没增加多少,限制却增加不少。
3 ansible的yaml配置文件称为剧本,稍复杂的功能,比如if,循环,用另一种语法jinja2,写配置文件模板,再嵌入yaml不嫌麻烦么? 3.1 powershell,通过powershell-yaml模块,支持yaml。 powershell可以在yaml文件中嵌入,任意powershell(子)变量,任意powershell(子)代码。
4 ansible官方只支持rhel和fedora,其他linux发行版并没有2进制包。在各种不同linux上,ansible安装自己都很麻烦,还安装别的。
shell远程功能弱,用powershell即可全部弥补。 powershell增强了【对象类型】,【属性】,【基于管道的属性】,而ansible并没有给shell增强这些, ansible增强了库,但这些库是部分重复于shell命令的,相当于重复造2手轮。 我更建议学习通用的轮子(linux命令),而不建议学习使用这些,小众的专用轮子。尤其是这些专用的轮子,并不比通用轮子方便,而且增加了学习成本。 ansible貌似致力于,做出一个个寨版的官方库,而不是调用官方库,并把这些寨版库,简单堆在一起。 就像py那样,不知道能不能成功。
问:为什么要学powershell? 1因为ps功能强大,且会越来越强,而不是落后的,要淘汰的东西。 2ps语法简单。学起来比bat,bash快。 3powershell ≈= shell + python。比它俩更适合于运维。学了ps,通吃win,linux。无需再学shell和python。即可【尽解所有脚本难题】。 4亚马逊的aws,vmware的vsphere,微软的azure,都有官方ps模块。
传教士旁白: 教程的设计,我是花了心思的。你们没看历史部分我写的很【简单粗糙】么?历史是一笔带过的。 但既然说了,就不是废话,就是想让学生菜鸟明确,从win7-win2008以后,脚本的【面向对象化】,才开始流行。引出下一章的面向对象详解。 任何ps入门教程,都应该提到面向字符和面向对象的区别。把这个话题揉到命令行历史去讲,简直再适合不过了。
----------第二章 面向对象之妙-------------- 什么是对象,为什么要面向对象, 为什么要淘汰bat,cmd,bash,微软为什么要丢掉cmd,重复造powershell轮?
面向对象例子1:
问:每天我吃2.2个苹果,17天我吃多少个苹果?
可以用 2.2 x 17。也可以用任何脚本语言都支持的i++。
for ($i = 1;$i -lt 18;$i++)
问题一变,我不告诉你天数,只告诉你, 每天我吃2.2个苹果,从2017年1月20日到6月20日,我吃多少个苹果? $天数 = ((get-date '2017-06-20') - (get-date '2017-01-20')).days #值151
每天我吃2.2个苹果,从2020年1月20日到6月20日,我吃多少个苹果? $天数 = ((get-date '2020-06-20') - (get-date '2020-01-20')).days #值152
for ($i=(get-date '2020-01-20');$i -lt (get-date '2020-06-20');$i=$i.adddays(1))
结论:有了日期对象,计算天数,小时等,很简单了。【for ,,i++】很常见,但我从没想过,数字i能是日期型的。
什么是对象,为什么要面向对象,微软为什么要抛弃【现有的,已经基本完善的,cmd命令】重复去造轮? 面向对象例子2: 布尔型变量,大家知道吧,一个变量(被限制成了)只有两个值。0/1,真或假。红或绿。bat,bash中无布尔型。 一个锅里被限制,只有红豆,绿豆。那么非红豆,就必然是绿豆。 我们想让【if ($a -ne $true)】返回唯一的值,但是shell就实现不了。 因为$a无法被限制成,只包含两个值。bash中的$a,除了红豆绿豆,还可以包含黄豆,黑豆,等。
布尔型中,只有0/1,【非0】,【非1】的情况只有一种,可以配合if,打造程序分支。 shell中,【非0】,【非1】的值有2,3,4,5,-2,-3,-4,-5等等。 if 1,走第一步,0走第二步。在bash,bat中,写起来就麻烦。1个if,else实现不了。 有布尔型变量,让代码写起来更简单。更严谨。
闹得沸沸扬扬的Spectre幽灵、Meltdown熔断两大漏洞事件,是咋回事? 它利用了计算机的一项重要特性,即预测执行(speculative execution)。 预测执行可以加强CPU的速度与性能,在CPU实际发出请求之前,就预测CPU可能执行的任务。 https://www.bilibili.com/video/av21021306 布尔型变量,就俩值,分支少。理论上,【cpu预测执行】的ps的if代码,就比bat,bash运行的快。
面向对象例子3: 女子【不记名购物卡】里多了两亿! http://news.ifeng.com/a/20180518/58352944_0.shtml bat,bash,python。把日期型,当成了数值型,每张卡都能多几亿! 我用不记名购物卡,又不是会员,购物没记录名字。哈哈。
bat ,bash中无变量类型。 python中有变量类型,但是【无法实现!】限制死某个变量的类型。 变量是否某类型,都要手动写if判断。如: a = 传入的金额 if a is date: 麻烦死,一旦忘写。。。 powershell就简单了。 [int]$a = get-date #将报错 [decimal]$a = get-date #将报错
powershell中的对象,继承于.net。
-----【字符型】----- system.string 字符串,这是最基本的。 system.char 单个字符。 System.Text.StringBuilder 内存中的,经常改变的,大字符串
-----【数值型】----- system.int32 system.int64 system.decimal system.double System.Numerics.BigInteger无限大整数。 常用的是int32,decimal。
1/3*3 等于1还是0.9999 就是靠数据类型控制。 -----【数组】----- system.array 数组。大多数我们用的数组的数据类型相同。比如说都是文件,也可以不同。比如第一个元素是字符串,第二个元素是时间。 system.arraylist 数组经常变化,如总在改写,追加,删除,就要用这个。速度比较快。 System.Collections.Generic.HashSet 去重数组。和python的set对象一样。
-----【表格】----- System.Data.DataTable sql表。 powershell ojbect对象表 表格的特色: 有字段名(属性名),并且字段名不能重复。
-----【其他】-----
常用对象就这些,必须精通。这是我给大家筛选出来的。
问:对象那么多,我的关注重点是什么? 集合对象。
问:你没列出的,不常用的,集合对象,在哪?全给我 中文手册在 https://docs.microsoft.com/zh-cn/dotnet/standard/collections/selecting-a-collection-class
问:对象那么多,我不想学。为啥要学它? 无论什么编程都要折腾数据,即折腾对象。 而每种对象,优缺点不同。暗含算法在里面。 面向对象编程,无需会算法, 必须理解每种对象的优缺点,合理选择对象。 学会选择对象,你就变【强】了,选择对象,比研究算法【简】单。
面向对象的优点是什么? 1 有了属性。 属性就是参数,比字符串粒度更小。在没有属性之前,我们就要用【烧脑正则】过滤,筛选字符串,简称【扣字符串】。有了属性就不用了。 2 有了方法。 方法就是程序,就是代码。无需自己重复编写。bat肯定是不行,没有方法,有也是个人写的,不可靠,不敢用。 方法可以是自己编写的ps函数,自己编写的ps类中的方法。 自己编写的方法,可以临时【并入】到第三方类中。 自己编写的方法,可以临时【并入】到.net类中。
问:面向对象的缺点是什么? 1传教士在向用winxp的人传授powershell时。那人说,powershell不好,对象太占内存,他说的是对的。 cmd中我用dir返回100个文件名(字符串)。powershell中我用dir返回100个文件对象,powershell占用的内存多。 但今时不同往日: 1.1不必要的内容不要存在变量中。或者用完立马销毁,减少内存占用。 $a = dir 存放100个文件的目录 #返回100个文件对象,占内存多。 $a = (dir 存放100个文件的目录).name #返回100个字符串,虽然省内存,但文件的属性方法也没了。
1.2内存大大滴够用了。因为cpu性能已经上不去了,我们正在疯狂加大内存,企图以空间换时间。 1.3我们更想要强大的功能,这年头面向对象是最基本的。py,php,java,.net,c++哪个不是面向对象的?
2.net虚拟机,运行慢的情况。 2.1 第一次运行慢。 2.2 刚开机运行慢。 这个问题在win7中存在,在win10中完全不存在了。 有计划任务,在计算机空闲时,定时循环优化虚拟机。 就好像大热天,你去饭店吃饭,叫瓶凉啤酒。python说我现给你冰镇。.net说我把一小时前冰镇的拿给你。 .net预先建立了线程池,用于加速代码。提前整理好了堆、栈、内存,用于加速数据。 这种优化是系统级别的,这种优化导致python永远达不到的性能。除非py也搞这么一个服务。
1对象比字符串粒度更大,更占内存。 2面向对象多了方法,功能更强。 3属性比字符串粒度更小,用起来极其方便。避免了【狂用烧脑正则去过滤】字符串! 4尽量不要在1000次以上的循环中,用管道。
===狂用烧脑正则去过滤例子,bat版的ping默认网关=== @echo off&setlocal enabledelayedexpansion echo 正在查找默认网关...
for /f "usebackq delims=" %%i in (
ipconfig /all
) do (
echo %%i|find /i "gateway">nul||echo %%i|find "默认网关">nul
if "!errorlevel!"=="0" (
for /f "tokens=2 delims=:" %%a in ("%%i") do for /f "delims= " %%m in ("%%a") do set ipgate=%%m
echo 默认网关是:!ipgate!
===========ping默认网关.ps1============
=======================
问:什么时候应该用对象? 需要方法,属性的时候。占95%。方法属性给了我们极大的便利。请看例子:
问:linux下用powershell统计文本行数,是不是这样写啊? Get-Content xxx.txt | Measure-Object -Line $a = Get-Content xxx.txt #返回一个数组,数组有.count或.length属性 。 $a.length或(Get-Content xxx.txt ).length
问:什么时候,不需要使用对象? 不需要方法,属性的时候。占5%,请看例子:
删除一个目录的需求。 用【rd /s 目录名】即可,没必要非用【Remove-Item -Recurse 目录名】
弹出u盘的需求。 用【mountvol 盘符: /d】即可。
问:即然面向对象这么好,那么这些对象都是从哪里来的? 答:从.net库中来。
---------- 第三章 .net 简介 --------------
问:.net 核心分为几个版本分支? 目前是三个版本。 .net 2.0 最新版.net 3.51 .net 4.0 最新版.net 4.72 .net core 2.x 最新版.net core 2.2 苹果系统,linux系统,嵌入式系统。 .net core 2.3,3.0得2020年才能成熟。
问:.net 有几个功能分支? 桌面分支 在.net中。包含winform。用于开发桌面窗口。 asp.net 在.net和.net core中。web服务器功能库。用于开B/S的web服务器。 f# 在.net和.net core中。包含数学库,三角函数库等。 powershell powershell本质是.net的分支。在.net和.net core中。包含脚本文件等常用系统管理接口。
问:.net程序(c#程序)如何连接mysql服务器? 去mysql官网下载.net语言的连接器。 mysql-connector-net-6.9.9-noinstall.zip--->v4.5--->MySql.Data.dll 给.net增加 MySql.Data 类,增加了数据库接口。
必须安装最新版本的.net库。winxp的机子先安装.net 3.51,win7和win2008的机子,先安装.net 4.7以上。
.net已经存在很多年了,比支持.net的软件比支持java的少不了多少。所有.net的分支,接口(数据库,微信等。) 那些dll,那些类库,powershell都可以调用。和c#编写的exe完全相同。
问:.net兼容库都在哪里?? https://www.nuget.org/
问:除了.net库的分支接口,java库的分支接口,powershell自己的库(模块)都有什么呢? 请看下一章
---------- 第四章 powershell常用的 内置库,外置库,第三方库 --------------
传教士帮白: 这章没法讲,只是罗列库和手册。把此章节收藏。走马观花地看了这些库,就知道powershell都能干啥了。
win2012手册地址:(最常用的ad模块) https://docs.microsoft.com/zh-cn/previous-versions/windows/powershell-scripting/dn249523(v=wps.630) ad用户组管理,dhcp,dns,打印机,文件共享,iis,磁盘,网卡,
exchange2016
https://docs.microsoft.com/zh-cn/powershell/module/exchange/active-directory/add-adpermission?view=exchange-ps
Active Directory 12
反垃圾邮件和反恶意软件 59
客户端访问 100
扩展代理 4
电子邮件地址和通讯簿 37
联合身份验证和混合配置 31
高可用性 22
邮件流 85
邮箱 74
邮箱数据库 23
邮箱服务器 4
移动和迁移 43
组织 9
权限 30
策略和合规性 89
服务器运行状况、监视和性能
共享和协作
sqlserver2014,2016,2017 https://docs.microsoft.com/zh-cn/sql/powershell/sql-server-powershell?view=sql-server-2017
lync2015,skype https://docs.microsoft.com/zh-cn/powershell/module/skype/?view=skype-ps
SharePoint2016 https://docs.microsoft.com/en-us/powershell/module/sharepoint-server/?view=sharepoint-ps
亚马逊虚拟机aws, http://docs.aws.amazon.com/powershell/latest/reference/Index.html
微软虚拟机Azure,hyper-v,
vmware vSphere企业级的虚拟机。 https://code.vmware.com/web/dp/tool/vmware-powercli/11.0.0 https://code.vmware.com/docs/7336/cmdlet-reference
服务,进程,日志,注册表,文件目录,远程管理。定时任务。ftp,邮件,ssh连接linux服务器的客户端插件。
xml,html,cvs,json,excel等。
excel https://docs.microsoft.com/zh-CN/office/vba/api/overview/excel
文本2语音
图形界面。
微软脚本中心 https://gallery.technet.microsoft.com/scriptcenter/
powershell软件源官网---powershell官方库。 https://www.powershellgallery.com
其他牛x库,都在github。另外,传教士群中定期发表【藏脚阁】之【牛x法宝】,都是好用的powershell第三方库。
---------- 第五章 入门必学必会 帮助命令的使用--------------
问:.net最新版本是多少?
问:powershell最新版本是多少? win上,不和linux互联的话,是5.1版。 和linux互联,需要在win,linux上安装powershell core。最新版是6.1.x
问:如何升级powershell? 1 对于win10,win2016,win2019你啥也不用做。 2 对于win7,win2008r2,win2012r2,你必须升级。 把.net升到最新版,即4.72。 把ps升级到最新版,即5.1。 升级文件,已经整理好,放在了群共享中。按照顺序安装1,2,3,4打头的软件即可。
问:powershell 6.x有啥新功能? 6还在持续完善中,新功能我会在群里,不定期分享。 分享的时候都会带上一本书的样子,标明ps秘籍和版本。
问:谁应该用powershell 6.x? 1 linux用户。或需要win-linux互联的用户。则必须用6.x版。 2 遇到ps5.1的bug的用户。具体问问群主,6是否fix掉了你遇到的bug。 3 发烧友,或想学新版功能的人。 4 除上面3点之外的,win用户,企业级用户,基本【不必要】安装,使用powershell 6.x。
问:如何看待powershell 6.x? 1 6.x基本上可以认为是给linux用的。 2 powershell 6.x 增加了少许库,语法。变更了少许功能。修正了少许bug。 3 版本。目前来讲,使用稳定的6.1.x稳定版足矣。2019年底前,powershell 6.2.0稳定版能发布。但是建议使用2020年发布的6.2.3及以上的版本。 4 linux中的powershell 6.x最大的问题,是缺少库。 4.1 第三方库,基本是win,linux通用的。这样的库也越来越多了。 4.2 win中的很多好用的库,命令,还没有linux版。
问:如何知道powershell版本? $PSVersionTable
问:如何列出本地模块? get-module -ListAvailable
问:只知道命令的一部分,如何查找命令? get-command service
问:知道命令,如何列出所有参数? get-help write-host -Parameter * show-command write-host
问:知道参数,但不知道哪个命令有此参数,如何查找有此参数的所有命令? 例子:想知道哪个命令有encoding参数,就用 get-command -ParameterName encoding
问:如何从命令行获取某命令帮助? get-help get-date
get-help get-date -Examples 命令例子 get-help get-date -online 在线手册
问:命令返回的对象里,有啥属性方法,如何得知? "abc" | get-member get-date | get-member
问:中文的.net类的手册在哪? msdn。最基本的字符串的属性和方法,的手册在。 https://msdn.microsoft.com/zh-cn/library/system.string.aspx
问:天天有分享,周周脚本题,的powershell学习研究群在哪? QQ群号=183173532 名称=powershell交流群
问:powershell 手册? QQ群号=183173532 ---》 群文件共享中 ---》 微软PowerShell2.0官方中文手册.chm
问:powershell学习分享网站? www.pstips.net
问:$()是啥?
是一个无变量名的变量,偷懒了。没有变量名,你无法看到【变量名,和其中的值】,不好调试。
$()和()的作用基本相同。即括号内的表达式,优先计算。如此说来,这两个和linux的【
xxx命令
】的作用差不多。
问:$()和()有啥区别? 有时候,某些泛型变量,某些属性,你不想用变量名保存,就得用$()。 你用(),只能返回类似于System.Collections.Generic,而不是值。
在bash中想省事,不想用变量名保存结果,而是直接输出计算结果。但是呢,累吐血也没算出来2+3
请看bash代码:
2 + 3
(2 + 3)
((2 + 3))
2 + 3
echo 2+3
echo 2 + 3
echo (2 + 3)
echo ((2 + 3))
echo
2 + 3
eval 2+3 eval 2 + 3 而python,powershell算2+3无此问题。
在ps中,包括我,还是经常用这种偷懒方法的。 偷懒,和不偷懒,的对比:
$a = get-date
问:$ 是啥? 1 $ 是 xxx命令 | foreach-object {} 中的枚举。 2 $_是一个无变量名的变量,偷懒了。
问:传教士,你为啥不建议使用$_ ? 偷懒节省变量名的意思是,全国10亿人,5亿叫张三,5亿叫刘德华。。。 把每个变量都放在,同一个变量名中,不好调试。 尤其是在两个管道,或更多管道的情况下。 新浪娱乐2018年7月13日讯,北京市第一中级人民法院发布了一则审判快讯, 案件为【军旅歌手乌兰托娅-蒙古族】,起诉,【《套马杆》原唱者乌兰托娅-蒙古族】公然使用其姓名,利用其知名度恶意盗用、冒用其姓名,要求被告停止使用其姓名并赔礼道歉、赔偿损失。 法院驳回了原告的诉讼请求。法院判乌兰托娅败诉,而乌兰托娅赢。结果乌兰托娅不服,又起诉,二审维持原判。
问:传教士你为啥不建议使用 | foreach-object {} 1 用 | foreach-object确实很方便,我也用。但很慢,不建议在1000次以上的循环中用。 此乃鱼与熊掌不可兼得,切记! 2 在 | foreach-object {} 中使用break,会打断整个脚本。 3 在 | foreach-object {} 中使用使用return,会变成continue。 4 在 | foreach-object {} 中使用continue,会不管用。 5 如果必须用,就要在每个管道前后,分别调试。然后再组合。
问:传教士你建议用啥?
foreach (
---------- 第六章 常用命令的介绍 --------------
文件,目录对象介绍:
第一个要学的命令就是dir,powershell没有find。
问:为什么要用powershell的dir【即Get-ChildItem】,而不用cmd的dir?
get-childitem d:\xxx
-file #过滤,只输出文件
-Directory #过滤,只输出目录
-Hidden #过滤,只输出隐藏
-Recurse #包含子目录
-Depth #目录深度
问:文件的常用属性是什么?
问:如何测试文件,目录是否存在? test-path d:\xxx\yyy.txt test-path /xxx/yyy.txt test-path /xxx/yyy -pathtype Container #测试是否有此目录 test-path /xxx/yyy -pathtype Leaf #测试是否有此文件
问:如何拆分目录,文件? Split-Path -Path "C:\Test\Logs*.log" -Leaf -Resolve #返回所有文件名即 Pass1.log Pass2.log
Split-Path -Path "C:\Test\Logs*.log" 返回:C:\Test\Logs\
问:如何合并目录,文件?
1 join-path
2 直接用构造字符串的方法:
问:神马是文件,目录的-LiteralPath? 不包含正则,通配符的。不会被正则转义的路径。和py的r'字符串'类似。 test-path -Path e:\电影[神秘博士][第十季]第6集_bd.mp4 #返回假,因为有[] test-path -LiteralPath e:\电影[神秘博士][第十季]第6集_bd.mp4 #返回真
问:【基于字符的外部命令】,如何把返回值,按行为单位,分成数组? $a = @(ipconfig) $a[8] #第9行 $a,$b,$c = 1,2,3 $d = 1..9
问:如何把文件拆分成行?后放入一个数组? $a = Get-Content a:\pscode\temp183\aaa.txt -ReadCount 0
问:如何把一行拆分成单个字符?
3种方法:
foreach (
for ($i = 0;$i -lt $行.length;$i++) $行.chars($i)
for ($i = 0;$i -lt $行.length;$i++) $行[$i] #支持负数
问:如何把【字符串】拆分成【数组】? 一般用-split。复杂的用上述的for办法。
问:如何把【数组】合并成【字符串】? 一般用-join
问:如何把【字符串】和【变量】进行合并? 字符串和变量合并,需要双引号,或@""@。单引号不行,会把$转义。
$a = 1 $ab = 2 echo "xxx$abyyy" #无法判断是$a还是$ab。
可以用下列3种方法,来合并字符串和变量: echo "xxx${a}byyy" echo "xxx$($a)byyy" "xxx{0}byyy" -f $a echo ("xxx"+$a+"byyy")
问:你为什么要教这些方法? 合并后的字符串。有可能传递给-f,convertfrom-string,进行下一步处理, 但是对此2命令来说,输入字符串若含有大话括号,需要转义,得改变源内容。
问:打开一个文件,作为一个大字符串,存入整个一个变量? $a = Get-Content a:\pscode\temp183\aaa.txt -raw
如何运行命令? 如何运行脚本? 脚本在.txt .cfg中,如何运行? 如何后台运行命令?在当前进程中运行,可以用: a.ps1 get-content b.txt | Invoke-Expression
在子进程中运行,可以用: 古有cmd /c "命令 参数" 今有powershell /c "命令 参数" , 或 powershell -c "命令 参数" , 或 powershell -command "命令 参数" , linux中用: /usr/bin/pwsh -c "命令 参数" 父进程如果是powershell,就可以用大花括号:powershell -command {命令} ,
不运行命令,而运行脚本的话,就用: powershell -file "d:\脚本.ps1" -字符串参数1 '字符串a' -数字参数2 1234 /usr/bin/pwsh -file '/tmp/a.ps1'
在【后台!】运行powershell.exe,或其他exe: start-process -path 你的任务.exe -ArgumentList '-你的参数1 aaaa -参数2 1234'
注意:运行ps命令或脚本,没必要通过cmd来调用。直接这样用即可: 操作系统(或你的进程中)---运行--->powershell.exe----->运行ps命令和ps脚本。
问:我想用另一个本地用户运行脚本,但powershell没有runas。exe 类似的命令咋办? powershell中有各种session呀。 ip+端口+用户名+密码=一个session,我只需更换用户名,更换密码,就可以更换权限。因为权限绑定在用户上。 同理,我只需要建立n个session使用,无需切换用户。 最主要的new-pssession,中有-Credential参数,输入用户密码,这不是跟runas。exe一样么?还有什么SmbSession。 所以我觉得powershell没有必要用runas。exe。 你只要用那些带session,带Credential的命令即可呀,对不?
查看参数名中,含【Credential】名的命令: get-command -ParameterName Credential
查看命令中,含【session】字符的命令: get-command session
问:如何用powershell发邮件? $附件 = Get-ChildItem '/tmp/aaaa.tar.gz' $HTML邮件内容 = html信件内容
Send-MailMessage -Subject "主题"
-From "你的hotmail账户@hotmail.com" -To "你的qq邮箱@qq.com"
-SmtpServer "smtp.live.com" -Port 587 -UseSsl -Credential "你的hotmail账户@hotmail.com" `
-Attachments $附件 -BodyAsHTML -body $HTML邮件内容
上面的代码,保存成带有bom头的a.ps1文件。 win中用: powershell.exe -file d:\你的目录\a.ps1
linux中用: /usr/bin/pwsh -file /你的目录/a.ps1
1win,linux中的powershell中用Send-MailMessage发邮件,需要免费email账户,无需自建smtp服务器。 2登录QQ的smtp服务器,默认被关了,需要在web设置中开启smtp。 3登录QQ的smtp服务器,用 [email protected] + 你的qq密码 + 上述命令 发邮件是不行的。因为为了qq密码安全,腾讯要求独立的邮箱密码。4win7自带ps2.0。而3.0和以上版本才支持port参数。总之1升级到.net最新版4.72升级ps到最新版5.1。 更多参数,详见手册: https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Utility/Send-MailMessage?view=powershell-5.1
5现在各大运营商,提高了发邮件的门槛: 5.1win,linux,黑客软件中搭建出来的“黑smtp服务器”,都被阻拦了。 5.2买个域名,并对此做个MX解析。“就不会被当作垃圾邮件的时代”也过去了。买域名太容易,建黑客网站太容易。 5.3运营商只对【大email服务提供者】,【ip建立白名单】。
问:监控win cpu,磁盘,网络,io等。 性能监视器或 Get-Counter 从本地和远程计算机上获取性能计数器数据。
问:如何查看有哪些计数器项目? 都是手册上的东西。 查有哪些大类用: Get-Counter -ListSet * | Sort-Object CounterSetName | Format-Table CounterSetName
比如我现在已经知道是磁盘大类是(PhysicalDisk)了,再查磁盘中有那些小类,用: (Get-Counter -ListSet PhysicalDisk).Paths
问:如何查看日志? 事件查看器,或 get-eventlog
问:如何执行字符串? $cmd1 = 'xxxx' Invoke-Expression $cmd1
问:powershell是否支持winxp?win2003? 1安装.net3.5 并重启,必要。 2安装.net4.0 。非必要。 3安装powershell最新版的2.0。 具体见群共享。
问:powershell传送文件,有哪些方式? http方式:Start-BitsTransfer winscp的webdav ftp方式:winscp(支持文件同步) sftp方式:winscp(支持文件同步),Posh-SSH模块 sshfs方式:严格来说,也属于上面。但毕竟有了盘符目录,比上面的感觉简单。 文件共享,samba方式:copy-item,robocopy(支持文件同步) iscsi方式:使用用户名+密码,影射某个ip上的,iscsi磁盘后,copy-item 微软官方的,powershell remoting+Just Enough Administration 引擎:copy-item -tosession -FromSession https://msdn.microsoft.com/zh-cn/powershell/wmf/5.1/jea-improvements 在 Windows 7 上使用 JEA 时,虚拟帐户仍不受支持。
第三方的 powershell remoting: https://github.com/pldmgg/misc-powershell/tree/master/MyModules/WinRM-Environment 中有Receive-ItemFromRemoteHost,Send-ItemToRemoteHost,用于传文件。
另外有人提出了【cmd+psexec】,我看了一下,本质上是【用命令,跑到远程机子上,调用net share建立共享。】 道理和文件共享,samba,是一样的。 高版本win中【命令】和【作用】都有替代的ps命令,顾【cmd+psexec】在低版本win上或许是鸡头神器, 而在powershell脚本大帝的宫殿(即高版本win)中,只能是孤单躺在角落中的凤尾花瓶。
powershell dsc:中的file模块,xrobocopy模块。
问:什么是命令交互? 简单理解为,服务器 《——————》客户机 之间聊天。特色是: 长连接+交谈
ssh在没有except的情况下,也是和ps一样,不支持交互。
问:有哪些交互命令? ftp,nslookup,telnet等。
问:powershell服务器,客户机之间,(命令,变量)交互,交谈,控制,有哪些方式? 所有这些都是通过,叫通ip,端口,用户,密码来访问。 1 老的。wmi+psexec。 2 ssh。 3 ps-remoting。 4 powershell-web-server。 基于浏览器的b/s方式。
那么好,单个命令我们已经学会不少了,下面我们来看powershell脚本的执行。
---------- 第七章 ps1脚本编写,调试,运行 -------------- 脚本是命令语句的组合和叠加。脚本就是胶水,四处去找别人调用,四处找轮子组装汽车。而不是做轮子,给别人用。
菜鸟问:如何写脚本? 1 必须搞清楚问题细节。例如:做月饼。 2 解题思路也基本完成。面粉和水,放入馅,蒸。老司机=先有解题思路后开车,新司机=路没搞明白,四处瞎撞,乱折腾。 3 使用什么命令,变量。加五仁,放入模子,挤压。 4 先粗写,写个大概。最好有旧代码可以抄。 5 调试通过。 6 详细写。考虑出错情况,加上错误代码,错误信息。去掉容易出错,不容易兼容的代码。改写性能不佳的代码。 到这一步为止,好的脚本可能不好看,但该的很好用了。 7 精雕细琢。重构,把重复使用的代码段,写成函数。重写变量名,使人能一眼看懂。格式化好代码,搞好缩进。
问:powershell最普遍的问题是什么? 1经统计,大概有40%问题,是由于低版本的bug引起的。 所以说提问之前,应升级.net版本到最新的v4.72。升级ps版本到最新的5.1。这些文件群共享都有。 就因为你懒惰,不升级,遇到了bug。你提问,大家再研究,最后发现是由于没升级造成的。 需要花费10倍的时间和精力!!!花费这些时间和精力,是毫无必要的!
2经统计,大概有30%问题,是由于win7,win2008,没有命令和库引起的。win7将被淘汰,微软不给win7发布新库,我也没法子。 所以说提问之前,尽量升级到win10。
3大概40%的问题,都是以前分享,解决过的。请珍惜群友身份,必须注意看已经分享过的内容!
问:编写ps1用什么ide? 最最推荐使用visual studio code,加上powershell插件。 语法提示,命令提示,参数提示。自动完成,代码格式化,缩进选择空格还是tab,文件编码设置。 有插件名叫ftp-sync,可以在win的vscode中编写ps1脚本,保存时,自动同步到linux目录中。
ise,powergui: 这两个和vscode相比,无语法提示。有命令、参数提示。简称【瘸了1条腿】
不建议使用: 这3个和vscode相比,无语法提示,无命令提示。简称【瘸了2条腿】
nodepad++ 只有代码高亮,颜色差。 Sublime Text 只有代码高亮,颜色差,高亮关键字过时。 atom 只有代码高亮,颜色差。
问:调试ps1用什么工具?如何单步运行脚本?如何在脚本的某行上,下断点?如何在图形界面中观察变量的值? win上建议使用powergui调试。生平不用火车头,纵然英雄,ps脚本也蹦吧报错! linux上只有一个调试工具即vscode。
问:如何在powershell.exe中,边执行,边观看脚本调用过程,并显示变量值?类似于sh -x 那样? 1 在powershell.exe中敲入命令:(放在脚本的第一行也行,第n行也行,放哪就从哪显示) set-psdebug -Trace 2 2 运行脚本。
问:如何脚本中,关键语句后,进入调试状态? 1+2 #关键语句 Wait-Debugger #作用:1+2 执行完毕后,进入调试器。用exit退出调试器。 3+4 #后续语句
问:代码格式化,用什么工具? 该缩进的都缩进,等号都对齐。 建议用powershell ise + ise 插件 【ISESteroids】
Install-Module -Name ISESteroids
ise中运行: Start-Steroids
问:让代码颜色漂亮,用什么工具? 1 用上面的工具把代码格式化好。 2 用群共享中,powershell_ise目录下,传教士diy的配色2016版。 3 抓图。世界上最赏心悦目,颜色漂亮的powershell代码产生了。
上述ide全都是中文的。
问:如何使用powershell-ise? 1 不建议在ise中,编写脚本。没有语法提示。建议用vscode编写脚本。 2 不建议在ise中,调试脚本。不会清空上次的变量,导致问题。建议用powergui调试脚本。 3 用了【传教士diy的,ise配色2016版】后,建议在ise中,看代码。颜色好。 4 用了ise插件【ISESteroids】后,建议用ise格式化代码。 5 建议在ise中看命令帮助,即ise右上角的按钮。
问:如何给脚本起名?xxx.ps1 建议用2---3个字母打头,剩下用中文文件名。即【bf备份所有旧文件_并删除10天前的.ps1】 这样先打【bf】,然后再打tab即可补全脚本名。
问:.ps1脚本,应该保存成什么编码? bom头+utf16le编码。或bom头utf8编码。 ps1脚本中,支持中文变量名,中文参数名,中文函数名等。 在普通电脑上,使用记事本,保存成unicode即可。 建议使用vscode保存,方便设置编码类型。
问:脚本中,一行太长怎么办?
1一行尽量只有一个表达式。
2命令行太长,可以用放在行尾的【1左面的
符号】折行。并把相关的参数放在同一行。请看: new-vm -cpu 2核 -内存 1000mb -磁盘 10gb
-内网ip 1.1 -外网ip 2.2
-系统 w2016 3运算符号后面,无需加
即可折行。
get-process notepad |
stop-process
问:如何开启powershell脚本运行权限? echo 下面代码,在管理员权限cmd中运行,在管理员权限powershell中运行均可。 echo 如果使用powershell remoting远程。本机,远程机,都要用管理员权限运行一遍。 "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted" "C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted" & "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted" & "C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted" pause
问:火车头(powergui)有什么缺点? 无法设置背景颜色。
问:你所使用的,vscode模块有哪些? powershell,vscode-icons,sftp
问:你所使用的,vscode配置文件内容是什么? 文件位于: C:\Users\你的用户名\AppData\Roaming\Code\User\settings.json "editor.fontFamily": "Microsoft YaHei Mono", "editor.fontWeight": "bold", "editor.fontSize": 25, "editor.tabSize": 4, "editor.insertSpaces": false, "editor.emptySelectionClipboard": false, "window.title": "${activeEditorLong}", "files.encoding": "utf16le", "files.eol": "\r\n", "files.defaultLanguage": "powershell", "window.reopenFolders": "all", "editor.formatOnSave": true, "editor.formatOnPaste": true, "editor.formatOnType": true, "editor.wrappingIndent": "indent", //回车后缩进 "editor.renderIndentGuides": true, //显示缩进竖线 "files.trimTrailingWhitespace": true, //保存时去除行尾空格 "powershell.codeFormatting.openBraceOnSameLine": false, //大花括号后换行。 "powershell.codeFormatting.newLineAfterOpenBrace": true, //大花括号后换行。 "powershell.codeFormatting.newLineAfterCloseBrace": true, //大花括号后换行。 "powershell.codeFormatting.whitespaceBeforeOpenBrace": true, //大花括号左面插入空格。 "powershell.codeFormatting.whitespaceBeforeOpenParen": true, //圆括号左面插入空格。 "powershell.codeFormatting.whitespaceAroundOperator": true, //运算符之间插入空格。 "powershell.codeFormatting.whitespaceAfterSeparator": false, //逗号,分毫后插入空格。 "powershell.codeFormatting.ignoreOneLineBlock": false, //if true,单行中的if else 不会被格式化。 "powershell.codeFormatting.alignPropertyValuePairs": true, //哈希表中等号对齐 "powershell.codeFormatting.preset" : "Allman", // if else 格式化样式 "workbench.colorTheme": "Monokai", "powershell.integratedConsole.showOnStartup": false, "terminal.integrated.shell.windows": "C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe", "terminal.integrated.fontSize": 22, "terminal.integrated.cursorStyle": "line", "terminal.integrated.cursorBlinking": true, "workbench.iconTheme": "vscode-icons"
问:如何使用,带有插件的,绿色版vscode? 下载zip版本,并设置相关目录。详见这里: https://code.visualstudio.com/docs/editor/portable
问:如何使用vscode在linux中调试powershell脚本? 问:如何在linux中,安装vscode。并在win中远程使用? 问:如何在linux中,单步执行,断点执行,powershell脚本? 1在linux中安装vscode。 https://code.visualstudio.com/docs/setup/linux
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl= https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc " > /etc/yum.repos.d/vscode.repo' sudo yum install code mkdir ~/vscode
2 如果你喜欢用linux桌面。则安装linux虚拟机 + 图形界面,如gnome。 vscode窗口显示在,linux虚拟机的桌面中。
3 如果你喜欢用win桌面。可以使用win + x11图形软件。 也就是说win加,linux虚拟机(建议至少2~3GB虚拟机内存)加,linux版ps(或c++,php等你的开发语言),加linux版vscode。但是【linux版vscode窗口】显示在win中。 经我测试,xmanager5不灵。但是vsxsrv这软件可以,而且配置简单。
https://sourceforge.net/projects/vcxsrv/
3.1 下载安装vcxsrv,运行XLaunch。
3.2 选multipe windows ---》start a programe ---》start programe on remote computer。 在“remote programe”输入框,输入: code --user-data-dir="/root"
在“Connect to computer”输入框,输入: 你的linux的ip地址
在“login as user”输入框,输入: 你的linux账户名,如root
在“password”输入框,输入: 你的linux密码
下一步 ---》保存 ---》文件名为:vscode.xlaunch
3.3 双击“vscode.xlaunch”文件,这是一个xml文本文件,选文件关联,关联给XLaunch。以后双击此文件,即可运行vscode。
3.4 成功看到vscode英文窗口。此时注意win防火墙,允许XLaunch通过。vscode中安装模块,重新运行,则变成中文vscode。
问:vscode有什么缺点? 调试功能慢,有时死锁。 没有工具栏,没有按钮 代码格式化,有不少格式坏的地方。
问:vscode有什么常用快捷键? ctrl + k,然后ctrl + 0 #折叠代码。不展开所有,大花括号。 ctrl + k,然后ctrl + c #行注释 ctrl + k,然后ctrl + u #除掉行注释 点中变量名后,ctrl + shift + l #一次性修改所有变量名 选中n行后,shift + alt + a #块注释,再按取消
问:ise有什么缺点? 无法选择编码保存,转换编码。 缩进为【空格】,【tab】两者都有。在其他文本编辑软件中,显示缩进错乱。不能显示缩进格式是tab,还是空格。 状态栏中没有编码,回车说明。 脚本执行完毕后,变量值没有清空。
问:编写脚本有什么忌讳? 忌讳一行流,把所有东西都往一行塞。尤其是初学者。 程序本来就是【把问题无限拆分,拆到足够小,足够简单,并解决】的过程。 写5行代码,比写1行代码,简单5倍,甚至10倍。 建议把表达式尽量拆分开,用多行。每行用最短的,最简单的表达式。 这样方便调试,也方便插入删除代码。
我发现即使使用【狂拆行流】这样,小脚本也大都10---30行。 ps函数大都30-50行,超过50行的函数不多。 ps脚本大都100-200行,超过200行的脚本不多。
【狂拆行流】能让菜鸟迅速成为【脚本大师】, 而【一行流】就是在菜鸟进步路上的【坑爹瘪三】!爹都得被坑,何况菜鸟?
当然了,菜鸟如果进步成熟手后,可以在【狂拆行流】的基础上进行合理的组合。 使脚本每个步骤逻辑清晰。
问:给脚本传参数,有什么忌讳? 如果输入数据是数组,那么尽量编写拆分数组的脚本。 把数组拆分成为一条数据后,存放于数据库,文件,csv文件,文件流等地方。
拆分数组代码,和只干活代码一定要分开。分为一个脚本中的两段代码,或两个脚本。
只干活脚本,只接受一条数据。不建议接受数组。 只干活脚本,不建议参数太多,如超过20个 只干活脚本,不建议参数太大,如超过xxMB 只干活脚本,很容易实现多线程并发,多进程并发。从而达到占用多核cpu,多io。
脚本想要模块化,尽量拆分成【读取】,【拆分】,【传输】,【处理】,【传输】,【写入】等部分。
---------- 第八章 实战 演练 -------------- 群友6504748,自己编写这部分。
5、实例一:开启和关闭服务 6、实例二:控制防火墙(打开关闭,规则) 7、实例三:设置策略(密码策略为例)
---------- 第九章 这些额外的选学课 你感兴趣吗?-------------- powershell脚本,命令行参数传值,并绑定变量的例子 http://www.cnblogs.com/piapia/p/5910255.html
让powershell同时只能运行一个脚本(进程互斥例子) http://www.cnblogs.com/piapia/p/5647205.html
powershell字符界面的,powershell加WPF界面的,2048游戏 http://www.cnblogs.com/piapia/p/5531945.html
powershell中的两只爬虫 http://www.cnblogs.com/piapia/p/5367556.html
PowerShell脚本:随机密码生成器 http://www.cnblogs.com/piapia/p/5184114.html
powershell 递归 算法 的例子 http://www.cnblogs.com/piapia/archive/2013/01/29/2881011.html
【PowerShell语音计算器】 http://www.cnblogs.com/piapia/archive/2012/10/20/2731506.html
1 列出所有efs加密文件。2解密所有efs加密文件 http://www.cnblogs.com/piapia/p/4702514.html 是为系统管理员,网管员编写的工具。 某员工离职后,他的磁盘假设有一万个文件(目录),其中efs加密的文件目录有3个。资源管理器中,这三个文件是绿色的。 但你要是(一万个目录)挨个点开看,是不是绿色,要累死。 这时网管用员工的win账户,登录员工pc机,用此脚本,即可列出所有efs加密文件。
---------- 第十章 请提问-------------- 各位卿家,有事启奏,无事退朝。
----------第十一章 linux篇-------------- 既然win中有了bash,那linux中有powershell也很正常,合理竞争,是件好事,受益的是用户。你想不竞争也不行。有摩擦正常,看开些。 win只有图形优势,而linux命令行不是比win命令行强大很多吗?你怕啥呀?
powershell比bash的优势总结: 1本地ps命令之间,ps函数之间,管道之间,基于ssh的远程【传对象值!】而不是字符串。甚至和数据库,图像接口之间,对象直传。 1.1用ps时可选择内存对象(如stringbuilder,arraylist,各种集合)作为缓存。 多线程还可以选择【线程安全型变量】,性能佳。丰俭由人,更灵活。而awk是个黑盒,无法操控。
2多线程方面。现有多线程,计时器。将来会有workflow多进程,使开发简单高效。 3转义符设计的比bash,python好。有面向对象方法,转义好。下详。 4支持csv,xml,json等。支持的数据格式比bash多。 5有where-object,group-object。分组筛选功能强,不用自己编码,这条算吗? 6容易学,容易改,算吗?ps语句简单标准,比bash脚本容易看懂。方法的使用,比烧脑正则容易学。 7ide中文,功能强,算吗?极大提高脚本编写速度。 8ps的语言内置的,调试功能强,算吗?
9linux癌症。 9.1 部分linux命令有【回车符】支持不全的问题。ps支持cr,lf,crlf。 9.2 linux中有数据对齐的癌症,ps中没有。下详。 9.3 面向字符脚本,必须要扣字符串,这是癌症。而面向对象脚本不用,完成同样的功能太省事了。如curl和Invoke-WebRequest 当然,现在linux中的ps命令,还不全,将来会越来越全。
10linux中就别用中文?即使在linux中,ps对中文的支持也和win中一样。你敢不赞? 10.1引号:支持中文单双引号,作为引号。 10.2空格:设置为空格,tab键,全角空格,都能正确运行。----bash无法识别中文空格,即全角空格。 10.3支持中文函数名,中文变量名。 10.4 findstr,grep都不支持编码。select-string有-encoding参数。凡是和编码,中文相关的问题无忧。
写这些的目的: 有些懂.net的程序员进入linux,他们不懂linux命令行,或许会觉得linux命令行多么神器+先进。 我写这些就是想告诉他们,linux命令行是真落后,.net才最牛。
传教士道:只要能装上powershell的linux版本,只需要ps1脚本,不需要sh脚本。 1 简单来讲,bash中只有语法,没有命令和库。 2 bash只有1%的语法功能,powershell实现不了。这很正常,世界上没有两片叶子是完全一样的。 这意味着你只需要ps1脚本,不需要sh。 3 bash太老了,同样的功能,powershell都能实现,还能省时间,如万个空for,powershell要节省90%的时间。 4 即学用/usr/bin/powershell 代替/usr/bin/bash。其他linux命令,管道,旧的功夫等,用法完全和在bash中一样。 5 逐渐用面向对象的,简单强大的,powershell命令和库,代替烧脑的linux命令,或者两者都用。---这是总的原则,总纲。
问:目前哪些linux能安装上powershell? ◦Windows 10 IoT Core(arm32的cpu,本质上是win,树莓派硬件上的win10) ◦Raspbian Stretch(arm32的cpu,树莓派官方操作系统Raspbian,基于大便,所以叫树莓便。) ◦MAC OS X 10.11 ◦Ubuntu 14.04/16.04/18.04 ◦Debian 8.x/9.x ◦CentOS 7.x/RHEL 7.x/Fedora26及更高版本 ◦open SUSE 42及以上/SUSE Linux Enterprise Server 12 SP2及以上 ◦Docker。LINUX发行版中,安装容器dockerd,docker中运行powershell。 ◦Arch Linux (arch linux 没有版本号) ◦Linux AppImage 容器(portable application single binary) https://github.com/probonopd/AppImageKit ◦Kali Linux ◦alpine Linux 这是docker专用的,轻量级linux发行版
问:目前哪些linux,可以通过snap包方式安装powershell? ◦Arch Linux/Fedora/elementary OS/OpenSuSE/Solus/Gentoo Linux/Debian/Linux Mit/Manjaro/OpenEmbedded/Yocto/OpenWrt/Raspbian等任何支持snap包的发行版
安装方法: (建议使用预览版,功能比较新,也没啥不稳定的) snap install powershell –classic #安装稳定版 snap install powershell-preview –classic #安装预览版
centos7及以上,安装powershell: curl -o /etc/yum.repos.d/microsoft.repo https://packages.microsoft.com/config/rhel/7/prod.repo sudo yum remove -y powershell #删除旧版 sudo yum install -y powershell pwsh -c 'mkdir -p "$env:HOME/.config/powershell" ' pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile ' pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '
ubuntu1604: curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/16.04/prod.list sudo apt-get update sudo apt-get remove -y powershell #删除旧版 sudo apt-get install -y powershell pwsh -c 'mkdir -p "$env:HOME/.config/powershell" ' pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile ' pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '
ubuntu1804: curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list sudo apt-get update sudo apt-get remove -y powershell #删除旧版 sudo apt-get install -y powershell pwsh -c 'mkdir -p "$env:HOME/.config/powershell" ' pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile ' pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '
debian9: sudo apt-get update sudo apt-get install curl gnupg apt-transport-https curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/microsoft.list' sudo apt-get update sudo apt-get remove -y powershell #删除旧版 sudo apt-get install -y powershell pwsh -c 'mkdir -p "$env:HOME/.config/powershell" ' pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile ' pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '
for alpine 3.8 linux的,powershell core 6.1 正式版,发布啦! 基于alpine 3.8 发行版的,powershell docker image,发布啦!
从【基于alpine发行版的,container中】,用powershell, 管理宿主机上的文件, 管理宿主机上的进程, 管理宿主机上的docker 容器, 管理宿主机上的docker image,在宿主机上: mkdir /powershell docker run -it --pid=host -v /powershell:/mnt mcr.microsoft.com/powershell:alpine-3.8 然后用powershell命令,读写container中 /mnt 下的文件即可。
问:大家都在哪些linux发行版,版本中,用powershell? 根据从微软powerbi网站得来的统计结果。比例不含win,只含linux。 https://msit.powerbi.com/view?r=eyJrIjoiYTYyN2U3ODgtMjBlMi00MGM1LWI0ZjctMmQ3MzE2ZDNkMzIyIiwidCI6IjcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0NyIsImMiOjV9&pageName=ReportSection5
1redhat7/centos7。占比25.35% 2ubuntu。占比44.42% 3debian。占比13.77% 这3种占83%
问:为什么说win的命令行powershell,已经比linux强? 1 win中的命令已经进化成面向对象的powershell。linux还不行。从win7开始,到win2012r2为止,进化结束。
2 从前我听说unix,linux命令多,很强大。但现在我告诉你,powershell命令比linux命令,至少多十倍。反正我这辈子是学不全了。
3 linux的更依赖图形,命令太少。而win命令比linux多很多。 3.1 linux中任何一款,邮件服务器中的命令,比exchange多,比exchange全?比exchange方便? 3.2 linux的dns服务器bind,不如win的dns命令方便。bind有给某个域中,域名添加ipv4的a记录的【命令】吗?还不是依赖web图形? 有人说用nsupdate。那还不是搞个文本,再运行文本。和用sed替换【dns区域文件】,然后在reload【dns区】有何区别呢?
4 新版win中,或者说是powershell中,都是【撸命令+参数】。而linux大都还在【sed撸文本】。 4.1 以给网卡配ip为例。 nmcli connection add type ethernet con-name NEW_STATIC ifname eno1234567 ip4 192.168.1.111 gw4 192.168.1.1, 不比用sed撸ifcfg-eth0文件方便么?
5 任何语言都要处理数据,脚本也一样。powershell有了对象的帮助,处理起数据来,比awk更得心应手。神马csv,excel,xml,json sql表,nosql表。html等。 6 powershell用本地对象,远程对象带来了简单强大。并不是要替换linux所有命令,某些命令不返回数据,用powershell用linux命令雷同。 用哪个其实无所谓,况且linux下powershell可能命令不全。你是为了简单强大,不必为了powershell而powershell。
问:powershell如何实现【sed -i "s/要查找的内容/替换成/g" 文件名】? 即打开文件,替换,保存文件。下列命令,测试通过: $f = '/etc/selinux/config' @(Get-Content $f) -replace 'SELINUX=enforcing','SELINUX=disabled' |Set-Content -path $f
问:为什么说linux中,用sed人越来越少了? 论点1:awk可以代替sed,但sed不能代替awk。 sed即,简单查找替换。awk有for之类的可以实现复杂处理。
论点2:awk用的是标准正则,sed的正则和sed部分相同,部分不同。 学了sed就代表脑中两套不兼容的正则标准相互打架。
论点3:sed一行流代码很天书,难写,他人难改,难调试。为了少打几个字不值得。
论点4:多年以前,以【天书为原则】的perl,和【以简单为原则】的python不相上下。 现在perl被评为最令人讨厌的语言。市场占有率也不行了。
问:那么说学awk就对了? 学powershell比学awk简单。 powershell用【split再split】,【if再if】,where-object,string.substing(),string[-3]等。 把字符串问题层层分解。比awk正则简单。
问:powershell中可以使用管道和awk吗? powershell中完全可以调用awk,和bash中完全相同。旧的武功,完全都灵。
问:用powershell的话,如何实现【awk '{print
Get-Content /xxx/yyy.txt | foreach-object {$_.split()[2]} #awk '{print $3}'
问:用powershell的话,如何实现【awk -f a.awk file】功能? 本质上,这是一个使用了管道的过滤功能。在powershell中,这叫做【过滤器】或者叫【筛选器】。 而powershell支持命令+管道+过滤器的组合。如 命令1 | 过滤器1 | 命令2 | 过滤器2 | 过滤器3 filter 过滤器1 这里写入n行代码,实现类似awk的功能
问:awk,sed的癌症是什么? xml,或html。 ------------这是别人总结的,我只是转帖。他说: 文本包含HTML代码,用awk、sed 等工具时,就需要考虑极其复杂的转义等情况,出错概率很大。还不如用c自己从头搞。
问:powershell中有【xargs】吗? 管道中使用的pipe变量名为:【$psitem】,它的别名为【$ 】。 powershell用foreach-object和$ ,来实现xargs的功能。这比xargs好很多,请看:
1管道前后直接传递数组,比字符串容易。无需切割。 2传递属性,比数组简单。
论据和说明: 假设我用ls |xargs 会返回5个文件,我分别取文件名和长度。这实际上是 5x2 个行列数组。我要使用这个二维数组中的数据。 第一维数据,xargs会切割每行出来5。第二维数据,xargs默认-d'\n',切割空格用xargs -d' '。 而ps无需切割字符串,直接出数组。 $a = @((1,2,3),(4,5,6)) $a |ForEach-Object { $_[0] } #输出1,4
同理,Get-ChildItem | ForEach-Object { $_.name } #输出5个文件的文件名。
问:powershell中有【<】【<<】【<<<】号吗? 或许从右到左的【<】符号反人类思维。powershell很多命令都给他改成了从左到右的。 如get-random < (1..100)在powershell中不合法,合法的应该是get-random -inputobject (1..100),或1..100 |get-random 只有不到1%的奇葩命令【必须】依赖【<】符号,这时可以通过在powershell中调用cmd,或在linux版powershell中调用bash来实现。 如$a = bash -x "命令1 < 命令2" #linux 如$a = cmd -c "命令1 < 命令2" #cmd
问:如何从win客户机的powershell中,经ssh协议,连接到linux的sshd服务器的bash中?
用powershell + 第三方ssh客户端库PoshSSH(install-module PoshSSH即可) + ip + 端口 + 用户名 + 密码,组合成一个连接,并向这个连接发命令。代码如下:
问:经过ssh协议连接的,服务器,客户端,【都】是powershell有何好处? 1好处是可以直接传输对象,无需经过序列化步骤。(对象--->转化为类似于json字符串--->传输到远端--->字符串转会对象)。 假如远程shell是bash,则连接用字符串,ps门派的【面向对象武功】全都废了。 2多线程。后台线程跑,不占用当前线程。而linux的ssh连接,是多进程的。 2.1对于100个以上的任务,多线程能省很多内存,即ps更适合大批量任务。 2.2对于100个以上的任务,多进程切换代价高。 比如每隔10秒,给100个线程分发任务,让线程去联网干活。 如果用主线程sleep 10,然后再告诉线程,第1个线程得到任务的时间,和第100个差不多。时间比多进程准。 3我们可以随时从session中【半路断开跑出来】,执行别的ps代码,函数,还可以【随时回session中去】。脚本写起来更灵活,调试方便。 4session带来了多个用户,不同的用户可以有不同的服务器权限。 5强大的powershell JEA。(正在开发实现中)
问:如何从客户机的powershell中,经ssh协议,连接到sshd服务器的powershell中? 服务器端: 指定默认shell为powershell即可。具体: linux: 1在linux服务器端,安装powershell。 2编辑【/etc/ssh/sshd_config】文件。加入下列行 PasswordAuthentication yes Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile 后,重启sshd服务器。 用openssh。帮助在: https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShellCommandOption -Value "/c" -PropertyType String -Force
客户机端:
win,linux:
安装powershell6.0后,多了-HostName参数,-UserName参数,用于连接sshd。
问:powershell经过ssh,远程运行命令,比bash强在哪? =============linux远程命令 & ps远程命令 对比例子============ 任意sh ---> ssh ---> linux上的bash: ssh [email protected] "以用户aaa权限执行的,命令xxx"
win,linux中的powershell ---> ssh ---> linux上的powershell: