Powershell知识点总结


Windows PowerShell 是一种命令行 外壳程序和脚本环境,使命令行用户和 脚本编写者可以利用 .NET Framework的强大功能。

它引入了许多非常有用的新概念,从而进一步扩展了您在 Windows 命令提示符和 Windows Script Host 环境中获得的知识和创建的脚本。

Windows PowerShell v3将伴随着Microsoft Hyper-V3.0和 Windows Server 2012发布。PowerShell v3是一个Windows任务自动化的框架,它由一个 命令行shell和内置在这个.NET框架上的编程语言组成。

PowerShell v3采用新的cmdlet让管理员能够更深入到系统进程中,这些进程可以制作成可执行的文件或脚本(script)。一条cmdlet是一条轻量命令,Windows PowerShell运行时间在自动化脚本的环境里调用它。Cmdlet包括显示当前目录的Get-Location,访问文件内容的Get-Content和结束运行进程的Stop-Process。

PowerShell v3在Windows Server 8中装载了Windows Management Framework 3.0。PowerShell运行时间也能嵌入到其它应用。


在Windows 操作系统里,点击开始->运行->输入PowerShell,进入windows PowerShell。在Windows 7中内置了PowerShell2.0, Windows 8中内置了PowerShell3.0。如果本机没有添加,可在网上下载安装包进行安装,或者下载WebPI,通过WebPI安装PowerShell。

由于以下原因,Windows PowerShell 使用它自己的语言,而不是重用现有的语言:
Windows PowerShell 需要用于管理.NET 对象的语言。该语言需要为使用cmdlet 提供一致的环境。该语言需要支持复杂的任务,而不会使简单的任务变得更复杂。 该语言需要与在.NET编程中使用的高级语言(如C#)一致。
1、PS1文件
一个PowerShell脚本其实就是一个简单的文本文件,这个文件包含了一系列PowerShell命令,每个命令显示为独立的一行,对于被视为PowerShell脚本的文本文件,它的文件名需要使用.PS1扩展。
2、执行权限
为防止 恶意脚本的执行,PowerShell有一个执行策略,默认情况下,这个执行策略被设为受限的(Restricted),意味着PowerShell脚本无法执行,你可以使用下面的cmdlet命令确定当前的执行策略:
Get-ExecutionPolicy 你可以选择使用的执行策略有:
Restricted -脚本不能运行。 RemoteSigned - 本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)。 AllSigned – 仅当脚本由受信任的发布者签名才能运行。 Unrestricted –脚本执行不受限制,不管来自哪里,也不管它们是否有签名。
你可以使用下面的cmdlet命令设置PowerShell的执行策略:
Set-ExecutionPolicy <policy name>
如果你想从命令行运行一个可执行文件,多年来一个永恒不变的方法是,在命令行转到该执行文件所在的位置,然后键入该执行文件的名称,但这个古老的方法现在却不能适用于PowerShell可执行脚本了。
如果你想执行一个PowerShell脚本,通常必须键入完整的路径和文件名,例如,假设你要运行一个名为a.ps1的脚本,你可以键入:
C:\Scripts\aps1 最大的例外是,如果PowerShell 脚本文件刚好位于你的系统目录中,那么你可以直接在 命令提示符后键入脚本文件名即可运行,如:
.\a.ps1 注意前面需要加上.\,这和Linux下执行Shell脚本的方法如出一辙。
4、管道
管道的作用是将一个命令的输出作为另一个命令的输入,两个命令(或cmdlet)之间只需要用管道符号(|)连接即可。
为了帮助你了解管道是如何工作的,我们以一个例子进行说明,假设你想创建运行在服务器上的进程列表,并按进程的ID号进行排序,可以使用Get-Process cmdlet命令获得进程列表,但默认情况下列表不会排序,如果将这个cmdlet命令的输出用管道输送给Sort-Object ID命令,进程列表将会按进程ID号进行排序,如:
Get-Process | Sort-Object ID
5、变量
虽然可以使用管道将一个命令的输出输送给另一个命令,但管道本身也是有限制的,当你用管道从一个命令向另一个命令传递输出结果时,输出结果立即被使用,但有时候,你可能需要保存输出结果一段时间,以便以后可以使用(或重用),这个时候管道就应该下场,轮到变量上场了。
人们很容易将变量想象成一个仓库,但在PowerShell中,变量可以保存命令的完整输出,例如,假设你想保存服务器处于运行中的进程列表,你可以将它赋给一个变量,如:
$a = Get-Process 在这里,变量被命名为$a,如果你想使用这个变量,只需要简单地调用它的名称即可,例如,键入$a便可在屏幕上打印变量的内容。
你可以将多个用管道连接的命令的最终输出赋给一个变量,只需要用一对小括号将命令括起来即可,例如,假设你想按进程ID对运行中的进程进行排序,然后将结果输出给一个变量,你可以使用下面这个命令:
$a = (Get-Process | Sort-Object ID)
6、@符号
通过使用@符号,你可以将列表内容转换成一个 数组,例如,下面的代码创建了一个名为$Procs的变量,它包含多行文本内容(一个数组):$procs = @{name="explorer","svchost"}
使用变量时你也可以使用@符号,为了确保它作为数组而不是单个值处理,例如,下面的代码将在我前面定义的变量上运行Get-Process cmdlet命令:
Get-Process @procs Windows将显示Windows 资源管理器和Svchost使用的所有进程,注意变量前使用的@符号,而不是常见的$符号。
7、Split
Split操作符根据你指定的字符拆分一个文本字符串,例如,假设你想将一个句子拆分成一个单词组成的一个 数组,你可以使用下面的命令做到:
"This is a test" -split " " 拆分后的结果如下:
This is a test
8、Join
就像Split可以将一个文本字符串拆分成多块一样,Join的操作则是逆向的,将多个独立的块连接成一个整体,例如,下面这行代码将会创建一个文本字符串,由我的名字和姓氏组成:
"Brien","Posey" -join " " 命令末尾双引号之间的空格告诉Windows在两个文本字符串之间插入一个空格。
9、 断点
运行一个新创建的PowerShell脚本时,如果脚本有Bug,会遇到意想不到的后果,保护自己的一个方法是在脚本的关键位置插入断点,这样你就可以确保脚本正常运行先,然后再处理可能存在的问题。
插入断点最简单的方法是根据 行号插入,例如,假设你要在第10行插入一个断点,可以使用下面的命令:
New-PSBreakpoint -Script C:\Scripts\a.ps1 -Line 10 你也可以将 断点绑定到变量上,如果你希望你的脚本任何时候都可以修改a$的内容,可以使用下面的命令:
New-PSBreakpoint -Script C:\scripts\a.ps1 -variables a 注意,我在变量名后并没有包括美元符号。
可以和PSBreakpoint一起使用的动词包括New,Get,Enable,Disable和Remove。
10、Step
调试一个脚本时,有时可能需要逐行 运行脚本,这时你可以使用Step-Into cmdlet命令,它会使脚本一行一行地执行,不管有没有设置断点,如果你想从这种步进式运行模式退出来,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令后,断点仍然有效。
顺便说一句,如果你的脚本使用了函数,你可能对Step-Out cmdlet更感兴趣,Step-Out的工作方式和Step-Into一样,不过,如果调用了一个函数,Windows不会逐步执行,整个函数将会一次性执行。


Powershell常用命令
1.Get-Command 得到Powshell所有命令
2.Get-Process 获取所有进程
3.Set-Alias  给指定命令重命名 如:Set-Alias aaa Get-Command 
4.Set-ExecutionPolicy remotesigned 设置powershell可直接执行脚本文件 一般脚本文件以.ps1结尾 执行脚本文件直接输入文件地址即可执行  脚本文件中只写命令即可
5.Get-Help get-* 查询以get开头的命令   Get-Help *service*  Get-Help Get-Command 获取Get-Command命令的基本用法
6.Get-Member 获取对象属性  如: $var | Get-Memeber  访问$var属性 直接$var.ToString()


PS中的变量定义
不需要定义或声明数据类型
在变量前加"$"
定义变量的规则
  -变量可以是数字 $123
  -变量可以是字符串 $abc
  -变量可以是特殊字符 ${@1b}
 内置的变量
   -$pshome
   -$home
   -$profile

变量赋值: $var=123  $var="aaaaaa"
取变量值: $var

变量赋值方法:Set-Variable var 100
取值方法:    Get-Variable var
清空值:      Clear-Variable var
删除变量     Remove-Variable var
取多个变量如var1 var2 var3地值:   Get-Variable var*

另一种赋值方法 $var1="bbb"    $var2="$var $var1"  结果$var2="aaaaaa bbb"
               $var2='$var $var1' 结果$var2="$var $var1"
$date=Get-Date  获取当前时间
$date.AddDays(3) 当前时间加3天

 

排序用法
Get-Process | Sort-Object ws   根据WS值由小到大排序
Get-Process | Sort-Object | fl    Get-Process | Sort-Object | Format-List  以列表形式显示数据

导入导出文件
Get-Process > c:/aa.txt
Get-Process | Export-Clixml c:/ddd.xml  将命令执行结果导出到xml文件中
Import-Clixml c:/ddd.xml  将xml文件导出到控件台


注释使用
Get-Proccess | #这里写注释信息
sort ws

比较运算符
$var="abc"
$var -like "&b&"  返回true
$var -clike "&b&"   返回true

 

函数使用
案例:在一个脚本文件中有如下代码:
$var1=10
function one{"The Variable is $var1"}
function two{$var1=20;one}
one 
two
one
执行结果: The Variable is 10
     The Variable is 20
          The Variable is 10
此示例表明,在函数中改变变量值并不影响实际值
若需改变其值请看如下代码:
$var1=10
function one{"The Variable is $var1"}
function two{$Script:var1=20;one}
one 
two
one
执行结果: The Variable is 10
     The Variable is 20
          The Variable is 20

 

freach使用
$var=1..6  #定义数组
foreach($i in $var)
{
   $n++
   Write-Host "$i"
}
Write-Host "there were $n record"


if使用
Get-Service | foreach{
  if($_.status -eq "running"){
     Write-Host $_.displayname  "("$_status")" -foregroundcolor "green"
  }
  else
  {
     Write-Host $_.displayname  "("$_status")" -foregroundcolor "red"
  }
}

 

error使用
function one
{
   Get-Process -ea stop
   Get-ChildItem ada -ErrorAction stop  #此句有误
   Get-Process -ErrorAction stop
}
one

-ea 定义当错误发生以后该如何继续执行
$?可以测试命令执行成功还是失败,成功则结果为true 反之为false

 

单步调试
先设置Set-PSDebug -step
for($i=1;$i -le 10;$i++)
{
  Write-Host "loop number $i"
}


25个常用PowerShell命令总结


入门级别

  1. 像文件系统那样操作Windows Registry——cd hkcu:
  2. 在文件里递回地搜索某个字符串——dir –r | select string "searchforthis"
  
  3. 使用内存找到五个进程——ps | sort –p ws | select –last 5
  4. 循环(停止,然后重启)一个服务,如DHCP——Restart-Service DHCP
  5. 在文件夹里列出所有条目——Get-ChildItem – Force
  6. 递归一系列的目录或文件夹——Get-ChildItem –Force c:\directory –Recurse
  7. 在目录里移除所有文件而不需要单个移除——Remove-Item C:\tobedeleted –Recurse
  8. 重启当前计算机——(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown(2)

  收集信息

  9. 获取计算机组成或模型信息——Get-WmiObject -Class Win32_ComputerSystem
  10. 获取当前计算机的BIOS信息——Get-WmiObject -Class Win32_BIOS -ComputerName .
  11. 列出所安装的修复程序(如QFE或Windows Update文件)——Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName .
  12. 获取当前登录计算机的用户的用户名—— Get-WmiObject -Class Win32_ComputerSystem -Property UserName -ComputerName .
  13. 获取当前计算机所安装的应用的名字——Get-WmiObject -Class Win32_Product -ComputerName . | Format-Wide -Column 1
  14. 获取分配给当前计算机的IP地址——Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Format-Table -Property IPAddress
  15. 获取当前机器详细的IP配置报道——Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -Property [a-z]* -ExcludeProperty IPX*,WINS*
  16. 找到当前计算机上使用DHCP启用的网络卡——Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName .
  17. 在当前计算机上的所有网络适配器上启用DHCP——Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName . | ForEach-Object -Process {$_.EnableDHCP()}

  软件管理

  18. 在远程计算机上安装MSI包——(Get-WMIObject -ComputerName TARGETMACHINE -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\MACHINEWHEREMSIRESIDES\path\package.msi)
  19. 使用基于MSI的应用升级包升级所安装的应用——(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='name_of_app_to_be_upgraded'").Upgrade(\\MACHINEWHEREMSIRESIDES\path\upgrade_package.msi)
  20. 从当前计算机移除MSI包——(Get-WmiObject -Class Win32_Product -Filter "Name='product_to_remove'" -ComputerName . ).Uninstall()
  机器管理
  21. 一分钟后远程关闭另一台机器——Start-Sleep 60; Restart-Computer –Force –ComputerName TARGETMACHINE
  22. 添加打印机——(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection(\\printerserver\hplaser3)
  23. 移除打印机——(New-Object -ComObject WScript.Network).RemovePrinterConnection("\\printerserver\hplaser3 ")
  24. 进入PowerShell会话——invoke-command -computername machine1, machine2 -filepath c:\Script\script.ps1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值