We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
本文大量例子都来自 Powershell中文博客,特别是其中的在线教程。 写这篇文章的目的主要是希望以后再需要写PowerShell时,可以通过读这篇文章,快速把它拾起来。因此文章中更多的是我觉得有用的例子。
最近一直帮我们公司产品接入SCVMM,因此写了一些PowerShell脚本为什么是PowerShell。不写不要紧,一写吓一跳,PowerShell真是名副其实——Power!虽然我还是一只PowerShell菜鸡,但是边写边查,写的还挺爽,虽然也遇到一些小坑,但是比想象的要顺利的多。对了,说下我的环境,本机MacOS,用的Mircosoft Romote DesktopRDP到一台Windows虚拟机,虚拟机操作系统版本是Windows Server 2012 R2 Standard,PowerShell版本是4.0。
为什么是PowerShell
Mircosoft Romote Desktop
Windows Server 2012 R2 Standard
4.0
学习总是从复制粘贴开始的,毕竟熟练的复制粘贴就是成功的一大半高手都是从模仿练习这一步来的。默认情况下(快速编辑模式,推荐使用此模式),PowerShell复制的方法是,左键选中要复制的内容,然后点击右键,确认选中。粘贴就是右键。如果将PowerShell设置到标准模式(即属性中去掉快速编辑模式中的对勾),那么复制都需要先右键标记,粘贴则是右键粘贴。
刚开始用PowerShell的复制粘贴,感觉是很奇怪的,不过用多了,也就习惯了。不过Powershell的复制粘贴经常失效。有时候,哐哐哐狂敲右键就是粘贴不了orz,经过我的反复折腾,解决这种情况用下面两种方法可以解决这种情况。
一个是重启大法。运行下面两行命令重启一下rdpclip.exe程序。
rdpclip.exe
taskkill -im rdpclip.exe -f rdpclip
另外一个是移花接木。从Mac上面复制,到PowerShell到粘贴,如果第一招不好用,就从Mac上面复制好后,先粘贴到记事本上,然后再从记事本上复制一次,再到PowerShell粘贴。虽然有点折腾,但是是可以成功的,总比手打强吧orz
PowerShell中的变量有三个点:不需要声明、不区分大小写和使用$符标明。除了区分大小写这条,其他与Python中的变量是非常类似的,比如只用一步就可以交换变量。注意,PowerShell中所有不是我们自己的定义的变量都属于驱动器变量(比如环境变量),访问方法见下面示例。
$
# 赋值 $num=2 $text="保存文本" $msg=$text*$num # 输出变量 $msg # output: 保存文本保存文本 # 交换变量 $num,$text=$text,$num $num # output: 保存文本 # 查看所有变量 ls variable: # 查看某一个变量的值,支持通配符 ls variable:Max* # 查看环境变量 ls env:
PowerShell命令的返回值都是数组,每行是一个元素,对,你没有看错,不是文本,是数组。PowerShell的数组有点像Python,可以存放不同类型的元素,支持索引选择,甚至支持负索引和多个索引,并且是引用类型。计算数组的元素使用.count,复制数组使用Clone()方法。
.count
Clone()
# 命令的输出都是数组 $res = ipconfig $res[0] #output: $res[1] #output: Windows IP 配置 # 数组创建,下面两种方式都是创建了一个元素为1,2,3的数组 $array_1 = 1,2,3 $array_2 = 0..9 # 空数组和判断数组类型 $array_3 = @() $array_3 -is [array] # 单元素数组,唯一的元素前加逗号 $array_4 = , 1 # 索引 $array_2 = 0..9 #output: 0,3,5,9 # 数组个数 $array_2.count #output: 9 $array_2.clone() #output: 元素为0-9的数组
# 创建 $hash = @{ key1 = "value1"; key2 = "value2"; key3 = "value3" } $hash # output: --- Name Value ---- ----- key3 value3 key1 value1 key2 value2 # 访问方式1 $hash['key1'] # output --- value1 # 访问方式2 $hash.key1 # output --- value1 # 哈希中Key和Value中的个数 $hash.Count # output: 3 # 展示哈希中的所有的key或者value $hash.Keys $hash.Values # 添加元素 $hash=@{} $hash.key="value" $hash # output: --- Name Value ---- ----- key3 value3 # 删除用remove $hash.remove("key")
PowerShell想Bash一样支持管道符。
# 按照长度排序 ls | Sort-Object Length # 按照两个维度排序 ls | Sort-Object @{expression="Length";Descending=$true},@{expression="Name";Ascending=$true} # 分组 ls | Group-Object Extension
# PowerShell中的逻辑运算符 -eq :等于 -ne :不等于 -gt :大于 -ge :大于等于 -lt :小于 -le :小于等于 -contains :包含 -notcontains :不包含 -and :和 -or :或 -xor :异或 -not :逆 # if语句 If( $value -eq 1 ) { "1" } Elseif( $value -eq 2) { "2" } Elseif( $value -eq 3 ) { "3" } Else { "4" } # switch语句 switch($value) { 1 {"1"} 2 {"2"} 3 {"3"} 4 {"4"} } # 使用 Switch 测试取值范围 switch($value) { {$_ -lt 1 } { "<1"; break} {$_ -gt 2 } { ">2"; break} {$_ -lt 3 } { "<3"; break} Default {"nothing"} }
PowerShell中的循环,支持for、while、do..while和foreach,同时支持break和continue,也可以利用Switch的特性实现循环。使用ForEach-Object 循环打印对象$_代表当前对象。
#for $sum=0 for($i=1;$i -le 100;$i++) { $sum+=$i } $sum #while $n=5 while($n -gt 0) { $n $n=$n-1 } # do..while do { $n=Read-Host } while( $n -ne 0) # foreach $nums=10..7 foreach($n in $nums) { "n=$n" } #使用Foreach循环 $nums=10..7 foreach($n in $nums) { "n=$n" } # output: n=10 n=9 n=8 n=7 #使用Switch循环 $nums = 10..7 Switch ($nums) { Default { "n= $_" } } # output: n= 10 n= 9 n= 8 n= 7
删除函数直接使用del方法。
# 函数的格式 Function FuncName (args[]) { code; } # 万能参数 $args 例子一 function sayHello { if($args.Count -eq 0) { "No argument!" } else { $args | foreach {"Hello,$($_)"} } } sayHello # output: No argument! sayHello LiLi Lucy Tom # output: Hello,LiLi Hello,Lucy Hello,Tom # 万能参数 $args 例子二 function Add { $sum=0 $args | foreach {$sum=$sum+$_} $sum } Add 10 7 3 100 #output: 120 # 指定参数 function StringContact($str1,$str2) { return $str1+$str2 } StringContact moss fly # output: mossfly StringContact -str1 word -str2 press #output: wordpress # 指定参数 function stringContact($str1="moss",$str2="fly") { return $str1+$str2 } stringContact Good Luck # output: stringContact stringContact # output: mossfly # 限制参数类型 function tryReverse( [switch]$try , [string]$source ) { [string]$target="" if($try) { for( [int]$i = $source.length -1; $i -ge 0 ;$i--) { $target += $source[$i] } return $target } return $source } tryReverse -source www.mossfly.com # output: www.mossfly.com tryReverse -try $true -source www.mossfly.com # output: moc.ylfssom.www
The text was updated successfully, but these errors were encountered:
No branches or pull requests
最近一直帮我们公司产品接入SCVMM,因此写了一些PowerShell脚本
为什么是PowerShell
。不写不要紧,一写吓一跳,PowerShell真是名副其实——Power!虽然我还是一只PowerShell菜鸡,但是边写边查,写的还挺爽,虽然也遇到一些小坑,但是比想象的要顺利的多。对了,说下我的环境,本机MacOS,用的Mircosoft Romote Desktop
RDP到一台Windows虚拟机,虚拟机操作系统版本是Windows Server 2012 R2 Standard
,PowerShell版本是4.0
。复制粘贴
学习总是从复制粘贴开始的,毕竟
熟练的复制粘贴就是成功的一大半高手都是从模仿练习这一步来的。默认情况下(快速编辑模式,推荐使用此模式),PowerShell复制的方法是,左键选中要复制的内容,然后点击右键,确认选中。粘贴就是右键。如果将PowerShell设置到标准模式(即属性中去掉快速编辑模式中的对勾),那么复制都需要先右键标记,粘贴则是右键粘贴。刚开始用PowerShell的复制粘贴,感觉是很奇怪的,不过用多了,也就习惯了。不过Powershell的复制粘贴经常失效。有时候,哐哐哐狂敲右键就是粘贴不了orz,经过我的反复折腾,解决这种情况用下面两种方法可以解决这种情况。
一个是重启大法。运行下面两行命令重启一下
rdpclip.exe
程序。另外一个是移花接木。从Mac上面复制,到PowerShell到粘贴,如果第一招不好用,就从Mac上面复制好后,先粘贴到记事本上,然后再从记事本上复制一次,再到PowerShell粘贴。虽然有点折腾,但是是可以成功的,
总比手打强吧orz变量
PowerShell中的变量有三个点:不需要声明、不区分大小写和使用
$
符标明。除了区分大小写这条,其他与Python中的变量是非常类似的,比如只用一步就可以交换变量。注意,PowerShell中所有不是我们自己的定义的变量都属于驱动器变量(比如环境变量),访问方法见下面示例。数组
PowerShell命令的返回值都是数组,每行是一个元素,对,你没有看错,不是文本,是数组。PowerShell的数组有点像Python,可以存放不同类型的元素,支持索引选择,甚至支持负索引和多个索引,并且是引用类型。计算数组的元素使用
.count
,复制数组使用Clone()
方法。哈希表
管道符
PowerShell想Bash一样支持管道符。
关于比较
循环
PowerShell中的循环,支持for、while、do..while和foreach,同时支持break和continue,也可以利用Switch的特性实现循环。使用ForEach-Object 循环打印对象$_代表当前对象。
函数
删除函数直接使用del方法。
The text was updated successfully, but these errors were encountered: