PowerShell 记录


PowerShell
https://www.cnblogs.com/lavender000/p/6935589.html 一篇基础文章
https://www.pstips.net/powershell-online-tutorials 官网文章
https://blog.csdn.net/wen197506/article/details/53870999 一个博主的总结文章

1,
执行文件,如果有空格使用&''这种方式
PS C:\WINDOWS\system32> &'E:\PowerShellTest\test.mp4'

执行脚本文件,必须以管理员的身份,然后执行以下命令设置权利:
set-executionpolicy remotesigned即可执行脚本

调用外部的脚本使用:PowerShell ""
PS C:\WINDOWS\system32> PowerShell "E:\PowerShellTest\test.ps1"

PowerShell提供了两个变量可以检测最后执行的命令是否成功:$lastExitCode和$?。
$lastExitCode:数字型变量,返回最后脚本或应用程序执行返回的退出码或出错级别:没错为0,出错为1.
$?:布尔型变量,返回最后执行命令的成功还是失败。如下:
PS C:\WINDOWS\system32> ping 1ocalhost
Ping 请求找不到主机 1ocalhost。请检查该名称,然后重试。
PS C:\WINDOWS\system32> $LASTEXITCODE
1
PS C:\WINDOWS\system32> ping local host
Ping 请求找不到主机 local。请检查该名称,然后重试。
PS C:\WINDOWS\system32> $?
False

用Get-Help命令查看别名:PS C:\WINDOWS\system32> get-help Get-ChildItem

如果想把得到的结果输出到文件中,可以使用Out-File命令将命令输出的结果保存在文件中:
PS C:\WINDOWS\system32> ls | Out-File E:\PowerShellTest\test2.txt 将ls命令的所有内容写入test2.txt这个文件
PS C:\WINDOWS\system32> Get-Content  E:\PowerShellTest\test2.txt 打印文件的内容

学习使用PowerShell过程中Get-Help/Get-Command/Get-Member是最常用的三大命令,要学会善用
PS C:\WINDOWS\system32> Get-Command ls
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias(别名)     ls -> Get-ChildItem

PS C:\WINDOWS\system32> Get-Help | Get-Member 使用这种方式获得某个命令的属性
   TypeName:System.String
Name             MemberType            Definition
----             ----------            ----------
Clone            Method                System.Object Clone(), System.Object 
GetHashCode      Method                int GetHashCode()

2,
定义变量
$a=10
$b=4
$result=$a*$b
powershell变量名大小写不敏感($a和$A 是同一个变量)。
如果变量名里有关键字,请把整个变量名后缀用花括号{}括起来。
${xxxxxxxxx vxgffdfdf$$$$} = 10
${xxxxxxxxx vxgffdfdf$$$$}
查看正在使用的变量:
PS E:\PowerShellTest> ls variable:
Name                           Value    
----                           -----   
$                              variable:                         
a                              10     
aaa                            10  

创建数组:
$aaa = 10,2,3
$aaa 
$nums=1..5 #1,2,3,4,5
$nums
$array = 10,2,(get-help),"xxx" 
$array
$a=@() #空数组
$a=,"moss" #1个元素的数组
$books[0] #访问数组元素
$result[0,3,5,12] #访问数组多个元素
$books+="元素4" #给数组添加元素
$nums=$nums[0..1]+$nums[3] #删除元素,其实就是覆盖
$chsNew=$chs.Clone() #复制数组
 [int[]] $nums=@() #强类型数组,只能为int类型
使用哈希表:
$stu=@{ Name = "小明";Age="12";sex="男" }
$stu["Name"]
在哈希表中存储数组:
$stu=@{ Name = "小明";Age="12";sex="男";Books="三国演义","围城","哈姆雷特" }
Books为一个数组,$stu["books"][0]
在哈希表中插入新的键值:$Student.Name="令狐冲"
$stu.Name="赵强" #重写
$stu.Remove("Name") #删除

创建对象:对象=属性+方法
通过New-Object可以创建一个对象
$myTestObj = New-Object object #根据类型创建实例,object是类型
Add-Member -InputObject $myTestObj -Name myObjVariable -Value 100 -MemberType NoteProperty
$myTestObj | Add-Member NoteProperty xxx 101 #使用管道为对象添加成员
$myTestObj | Add-Member ScriptMethod myFun {"i am fun"}#使用管道添加函数 
$myTestObj #打印所有变量
$myTestObj.myObjVariable
$myTestObj.myFun() #在调用方法时如果没有使用圆括号,方法不会执行,但是可以返回方法的基本信息。
打印如下:
myObjVariable xxx
------------- ---
          100 101
100
i am fun
查看对象的所有属性:
$host | Get-Member -memberType property
修改,访问属性只需要使用.就行。
$Host.UI #访问一个属性,且该属性是一个对象
$host.ui.rawui.BackgroundColor = "Green" #修改
Get_ 和 Set_ 方法
所有名称以”get_”打头的方法都是为了给对应的属性返回一个值。set_则是赋值:
$Host.get_Version()
查看对象的所有方法:
$Host | Get-Member -MemberType Method
$obj.Delete() #删除该对象
低级函数:Write-Debug "Hello 2012 !"
不同的方法类型
类似于属性,Powershell对象也可以增加方法,方法类型包括:
CodeMethod:映射到静态的.NET方法
Method:正常的方法
ScriptMethod:一个执行Powershell脚本的方法
可以通过方括号和类型名称得到类型对象本身,然后通过Get-Memeber命令查看该类型支持的所有静态方法。
[System.DateTime] | Get-Member -static -memberType *Method
[System.DateTime]::Parse("2012-10-13 23:42:55") #调用静态方法
对象类型转换
使用System.Net.IPAddress类将字符串IP地址转换成一个IPAddress实例:如下:
[Net.IPAddress]'10.3.129.71'
根据类型创建实例
$webClient=New-Object Net.WebClient

创建对象
使用构造函数创建一个指定类型的实例对象:如下:
New-Object String(‘*’,3) #***
[String].GetConstructors() | foreach {$_.tostring()} #查看构造函数
打印如下:
Void .ctor(Char*)
Void .ctor(Char*, Int32, Int32)
通过类型转换创建对象
[DateTime]$date="1999-9-1 10:23:44" #将字符串转换成DataTime类型
[char[]]"mossfly.com" #将对象转换成数组

加载程序集:Test.dll
$TestDLL=ls .Test.dll #拿到Test.dll的全部信息,.是什么?要运行当前目录下的命令,需要文件名前加.\。如:.\test.ps1
[reflection.assembly]::LoadFile($TestDLL.FullName) #FullName是完整的地址
$stu=New-Object Test.Student('Mosser',22) #使用dll中的类创建对象

使用COM对象
New-Object -ComObject DAO.Relation.36

比较运算符
-eq :等于  -ne :不等于  -gt :大于  -ge :大于等于  -lt :小于  -le :小于等于  -contains :包含  -notcontains :不包含
PS C:\Users\Administrator> 10,8,9 -contains 9
True
PS C:\Users\Administrator> 10 -ne 9
True
布尔运算
-and :和  -or :或  -xor :异或  -not :逆
PS C:\Users\Administrator> -not $true
False

Where-Object会对集合逐个过滤,将符合条件的结果保留。
PS C:Powershell> Get-Process | Where-Object {$_.Name -eq "notepad"}
根据company过滤所有产品发布者以”Microsoft”打头的进程:
PS C:\Users\Administrator> get-process | where-object {$_.company -like '*Microsoft*'} | select Name , Description , Company
Name                                            Description                                    Company                                       
----                                            -----------                                    -------                                       
Code                                            Visual Studio Code                             Microsoft Corporation   
dllhost                                         COM Surrogate                                  Microsoft Corporation                         
dwm                                             桌面窗口管理器                                  Microsoft Corporation                         
EXCEL                                           Microsoft Office Excel                         Microsoft Corporation  

因为Where-Object的使用概率比较高,所以有一个很形象的别名 ? 可以使用:
PS C:Powershell> Get-Service | ? {$_.Name -like "B*"} 筛选出以B开头的server

条件:
PS C:\Users\Administrator> $num = 0
PS C:\Users\Administrator> if($num -lt 0){"xxxxxxxx < 0"}elseif($num -eq 0){"xxxxxxxxxxx = 0"}else{"xxxxxxxxxxx > 0"}
xxxxxxxxxxx = 0

Switch语句:几种不同形式
基本形式:
PS C:\Users\Administrator> $value = 10
PS C:\Users\Administrator> switch($value){1{"xx 1"} 2{"xx 2"} 10{"xx 10"}}
xx 10

多个条件匹配:
PS C:\Users\Administrator> switch($mytest){  {$_ -lt 100} {"xxxx "}  {$_ -lt 200} {"xxxx 2 "} }
xxxx 
xxxx 2 

比较字符串:
$domain="www.mossfly.com"
switch($domain)

Switch有一个-case 选项,一旦指定了这个选项,比较运算符就会从-eq 切换到 -ceq,即大小写敏感比较字符串:
switch -case ($domain)

没有匹配条件:
PS C:\Users\Administrator> switch($mytest){  {$_ -lt 1} {"xxxx 1"}  {$_ -lt 2} {"xxxx 2 "} default {" no select"} }
no select

使用Break关键字:
PS C:\Users\Administrator> switch($mytest){  {$_ -lt 100} {"xxxx 100" ; break}  {$_ -lt 200} {"xxxx 200 "} default {" no select"} }
xxxx 100

$_ 代表当前的数据。

Foreach 循环:
PS C:\Users\Administrator> foreach($file in dir F:\csv工作表){ if($file.Length -gt 1kb){ $file.Name }  }
打印:
一键全买功能.xlsx
翅膀.xlsx
自动打10次竞技场.xlsx

Do While 循环:
while($a -lt 10){ $a = $a + 1 $a }
$a = 5 while($a -lt 10){ $a  $a = $a + 1  if($a -eq 7){ continue } } # or use break

For 循环
PS C:\WINDOWS\system32> for($i = 0 ; $i -lt 5 ; $i++){ $num++ } $num
5
Switch 循环,当传入的参数为数组时,便会进行循环操作
PS C:\WINDOWS\system32> $num = 1,2
PS C:\WINDOWS\system32> switch($num){ {($_ % 2 -eq 0)} {"偶数"} {$_ % 2 -eq 1} {"奇数"} }
奇数
偶数




 

猜你喜欢

转载自blog.csdn.net/tran119/article/details/82904565