在Powershell中设置:
1 |
Set-PSReadlineOption -EditMode Emacs |
使得Powershell中可以:
- ctrl – D : 退出
- ctrl – W:删除一个词
- ctrl – A: 跳到行首
- ctrl – E: 跳到行位
- 等等,和使用bash的快捷键很相似了
话说,上面那行在哪里设置?
就是Powershell中直接输入: $PROFILE 回车,就是这个文件
参考:
在Powershell中设置:
1 |
Set-PSReadlineOption -EditMode Emacs |
使得Powershell中可以:
话说,上面那行在哪里设置?
就是Powershell中直接输入: $PROFILE 回车,就是这个文件
参考:
Hello world:
解说:
示例1: 解析netstat -ant结果为对象
1 |
netstat -ant|select -Skip 2|foreach -Begin {[string]::join(",", @("proto","rq","sq","local","remote","stats"))} {$_ -replace "\s+",","}|ConvertFrom-Csv |
hashtable的构造:
1 2 3 4 5 6 7 8 |
PS /home/phpor> $ht=@{k1="v1"; k2="v2"; k3="v3"} PS /home/phpor> $ht Name Value ---- ----- k1 v1 k3 v3 k2 v2 |
注意:
遍历:
使用cmdlet版的foreach遍历:
注意:
遍历出key信息:
注意:
原材料:
1 2 3 4 5 |
> $a=@("a", "b", "c") > $a a b c |
foreach有三种形态:
cmdlet形态,如下:
1 2 3 4 |
> $a|foreach {$_} a b c |
foreach 语句形态,如下:
1 2 3 4 |
PS /home/phpor> foreach($i in $a) {$i} a b c |
foreach方法形态,如下:
1 2 3 4 |
PS /home/phpor> $a.ForEach({$_}) a b c |
参考:
https://ss64.com/ps/foreach.html
https://ss64.com/ps/foreach-method.html
注意: foreach一般是看不到key的,如何才能看到key呢?
如下脚本,通过where cmdlet过滤出来netstat中已连接状态的连接:
可以发现, 使用字符串的split选项可以凑效,但是,使用字符串的split方法不能凑效; 因为split选项支持正则分隔符,split方法不支持正则分隔符,其实第二种写法是不对的。split方法只能按照单个字符分隔
参考: https://msdn.microsoft.com/en-us/library/System.String.Split(v=vs.110).aspx
统计每种tcp状态的数量:
1 2 3 4 5 6 |
netstat -ant|select -Skip 2|foreach -Begin {$arr=@{}} {$state=($_ -split "[\s]+")[5] ; $arr[$state]++; } -End {$arr} Name Value ---- ----- LISTEN 2 ESTABLISHED 2 |
其中,begin、end都很类似awk的用法
改进: 如何按照名字的升序进行输出呢:
1 2 3 4 5 6 |
netstat -ant|select -Skip 2|foreach -Begin {$arr=@{}} {$state=($_ -split "[\s]+")[5] ; $arr[$state]++; } -End {$arr.GetEnumerator()|Sort-Object -Property name } Name Value ---- ----- ESTABLISHED 2 LISTEN 2 |
注意这里sort的使用,需要使用 GetEnumerator(), 因为$arr 本身是一个大对象,本没有迭代为多个对象输出,是不会被sort的,所以需要$arr.GetEnumerator() ,然后输出给sort
tips: sort的 -Property 可以不写,直接 sort name (或)sort value
格式化输出:
1 2 3 |
netstat -ant|select -Skip 2|foreach -Begin {$arr=@{}} {$state=($_ -split "[\s]+")[5] ; $arr[$state]++; } -End {$arr.GetEnumerator()|foreach {$_.name +":"+ $_.value} } LISTEN:2 ESTABLISHED:2 |
PowerShell 是一个可以操作对象的高级shell,是一个支持模块的shell。
如何编写模块?参考:http://www.jb51.net/article/56229.htm 基本上就是在模块目录下写一个包含有一些函数的文件,一个这种文件就是一个模块,然后配之以一个同名(不同扩展名)的manifest文件
段注释:
1 2 3 4 5 |
<# .... #> |
行注释:
1 |
#this is comment |
实例:
web请求:
方法1:http://blog.csdn.net/qq_34352010/article/details/53572234
方法2:
1 |
PS3> $(New-Object -TypeName System.Net.WebClient).downloadstring("https://baidu.com") |
文本处理:
http://www.pstips.net/processing-text-1.html
http://www.pstips.net/processing-text-2.html
http://www.pstips.net/processing-text-3.html
解析url:http://www.pstips.net/processing-text-4.html
获取所有的IPv4地址:
1 2 3 4 |
PS C:\Users\phpor> ipconfig |Select-String ipv4 |ForEach-Object {$a=$_ -split ":" ; if($a) {$b=$a[1] -split "\(" ;$b[0].trim()}} 172.16.161.13 10.0.2.15 192.168.56.1 |
获取ifconfig的ipv4地址:
1 |
ifconfig|Select-String -Pattern "\s*inet\s([0-9.]+)"|foreach {$_.Matches.Groups[1].Value} |
注意: 正则表达式的正确使用使得事情变得更加利索
PowerShell 显示气球提示框: http://www.pstips.net/powershell-displaying-balloon-tip.html
多个对象之间用逗号分隔:
1 2 3 |
PS C:\Users\phpor> "a", "b" a b |
单引号与双引号:
1 2 3 4 5 6 7 |
PS C:\Users\phpor> $word="World" PS C:\Users\phpor> "Hello, $word" Hello, World PS C:\Users\phpor> 'Hello, $word' Hello, $word |
单引号中的单引号,双引号中的双引号:
1 2 3 4 5 |
PS C:\Users\phpor> """a""" "a" PS C:\Users\phpor> '''a''' 'a' |
单引号中连续的两个单引号解释为1个单引号,双引号中连续的两个双引号解释为1个双引号
一般都是用反斜线转义,但是powershell中使用反引号来转义,如:
1 2 3 4 5 |
PS C:\Users\phpor> "a`"b" a"b PS C:\Users\phpor> "a`nb" a b |
命令结果赋值给变量的写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
PS C:\Users\phpor> $a=$(get-date) PS C:\Users\phpor> $a 2017年2月18日 23:49:21 PS C:\Users\phpor> $a=get-date PS C:\Users\phpor> $a 2017年2月18日 23:49:32 PS C:\Users\phpor> |
使用 $( cmd ) 的写法更舒服一些,更加接近于bash的写法
ISE比命令行写起来会舒服一些,不但有提示,还方便查帮助
PowerShell是已模块的形式添加功能的
选中命令时,下面就会出现命令的参数信息,按住ctrl点击命令时,参数信息界面就会隐藏