Skip to content
New issue

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 #3

Open
DamaoShao opened this issue Aug 3, 2020 · 0 comments
Open

快速上手Powershell #3

DamaoShao opened this issue Aug 3, 2020 · 0 comments

Comments

@DamaoShao
Copy link
Owner

本文大量例子都来自 Powershell中文博客,特别是其中的在线教程
写这篇文章的目的主要是希望以后再需要写PowerShell时,可以通过读这篇文章,快速把它拾起来。因此文章中更多的是我觉得有用的例子。

最近一直帮我们公司产品接入SCVMM,因此写了一些PowerShell脚本为什么是PowerShell。不写不要紧,一写吓一跳,PowerShell真是名副其实——Power!虽然我还是一只PowerShell菜鸡,但是边写边查,写的还挺爽,虽然也遇到一些小坑,但是比想象的要顺利的多。对了,说下我的环境,本机MacOS,用的Mircosoft Romote DesktopRDP到一台Windows虚拟机,虚拟机操作系统版本是Windows Server 2012 R2 Standard,PowerShell版本是4.0

复制粘贴

学习总是从复制粘贴开始的,毕竟熟练的复制粘贴就是成功的一大半高手都是从模仿练习这一步来的。默认情况下(快速编辑模式,推荐使用此模式),PowerShell复制的方法是,左键选中要复制的内容,然后点击右键,确认选中。粘贴就是右键。如果将PowerShell设置到标准模式(即属性中去掉快速编辑模式中的对勾),那么复制都需要先右键标记,粘贴则是右键粘贴。

刚开始用PowerShell的复制粘贴,感觉是很奇怪的,不过用多了,也就习惯了。不过Powershell的复制粘贴经常失效。有时候,哐哐哐狂敲右键就是粘贴不了orz,经过我的反复折腾,解决这种情况用下面两种方法可以解决这种情况。

一个是重启大法。运行下面两行命令重启一下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()方法。

# 命令的输出都是数组
$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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant