欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PowerShell 3.0 教程笔记

程序员文章站 2023-12-30 17:52:28
...

PowerShell 3.0 教程笔记

Module_0_视频链接

快速入门 PowerShell 3.0【MVA】中文字幕

Module_1_克服对Shell的恐惧

  1. 开始使用PowerShell前应该先配置好PowerShell(但是当前已经可以直接使用Windows Terminal了,不配置了)

  2. cmdlet的格式:动词-名词

  3. set-location:切换当前工作路径

  4. get-childitem:获取当前工作路径下的文件/目录列表

  5. clear-host:清空显示区

  6. aliascmdlet的别名

  7. get-alias:列出所有的别名和对应的cmdlet列表

    1. get-alias可以使用*通配符来搜索别名列表,例如get-alias g*搜索g开头的别名列表,get-alias *sv搜索sv结尾的别名列表
    2. Get-Alias -Definition cmdlet通过cmdlet查找别名
  8. help:获取帮助信息

  9. PowerShell支持Windows原生命令

    1. notepad:打开文本编辑器
    2. calc:打开计算器
    3. mspaint:打开画图
    4. ping:测试网络连通性
    5. ipconfig /all:获取网卡信息

Module_2_帮助系统

  1. update-help:更新帮助系统
  2. get-help:获取cmdlet的帮助信息
    1. help
    2. man
    3. *代表通配符,匹配0个到多个字符
  3. get-verb:获取动词信息
  4. get-help cmdlet -Detailed:获取详细的帮助信息
  5. get-help cmdlet -Examples:获取帮助信息中的例子列表
  6. get-help cmdlet -Full:获取全部的帮助信息
  7. get-help cmdlet -Online:使用默认浏览器获取在线帮助信息
  8. get-help cmdlet -ShowWindow:使用新窗口获取全部的帮助信息
  9. get-service:获取服务信息
  10. get-process:获取进程信息
  11. 技巧:通过get-help*(通配符)加关键字(例如:get-processs可以用*pro*)来查找命令列表,然后通过get-help cmdlet -ShowWindow获取感兴趣的命令的全部的帮助信息,从帮助信息中获取例子并尝试使用

Module_3_使用管道建立连接和扩展Shell

  1. 管道即|,用于连接命令,将命令的结果传递到下一个命令中,再传递到下一个命令中,产生更好的结果

    1. 例如:get-process | export-csv -Path "C:\processInfo.csv"就是获取所有进程信息对象并导出到C:\processInfo.csv文件中
  2. export-csv:将cmdlet执行结果导出到csV

  3. import-csv:将csv文件中的数据导入PowerShell

  4. export-clixml:将cmdlet执行结果导出到xml

  5. import-clixml:将xml文件中的数据导入PowerShell

  6. compare-object:对比两个PowerShell对象并打印出其中不相同的部分

    1. Get-Process | Export-Clixml -Path D:\process.xml
      notepad
      notepad2
      calc
      Compare-Object -ReferenceObject (Import-Clixml -Path D:\process.xml) -DifferenceObject (Get-Process) -Property name
      
    2. 上述命令列表对比了两个不同的时刻,计算机里运行的进程列表的名字,并打印出不同的部分

  7. out-file:将cmdllet执行结果输出到指定的文件中

  8. get-content:将文件中的数据读取到PowerShell

  9. cmdlet后面加上-whatifPowerShell会把cmdlet执行后的结果打印出来,但是并不会执行该cmdlet,即模拟执行

  10. cmdlet后面加上-confirmPowerShell会在cmdlet执行前将执行后的结果打印出来,并询问是否确认执行

Module_4_用于管理的对象

  1. cmdlet返回的是对象,而不是文本
  2. 对象由属性和方法组成
  3. Get-Process | Where-Object -Property id -gt 10000 | Sort-Object -Property id:获取进程信息对象->只保留id大于10000的->以id属性正序排序
  4. get-member:获取对象的类型、属性列表、方法列表
    1. 例如get-process | get-member为获取进程信息对象的类型、属性列表、方法列表
  5. select-object:选择对象的属性
    1. 例如:Get-Process | Select-Object -Property HandleCount,Name,CPU为获取进程信息对象->只获取进程信息对象中的句柄、名字、CPU占比属性
    2. 例如:Get-ChildItem | Select-Object -Property Name,Length | Sort-Object -Property Length为获取当前目录下的文件\文件夹对象->只获取名字和长度属性->以长度属性正序排序
    3. 例如:Get-ChildItem | Select-Object -Property Name,Length | Sort-Object -Property Length -Descending为获取当前目录下的文件\文件夹对象->只获取名字和长度属性->以长度属性倒序排序
  6. get-history:获取输入过的命令历史信息
  7. Get-Process | Group-Object -Property Name | Sort-Object -Property Count:获取进程信息列表->合并相同Name属性的对象->以数量正序排序
  8. Get-Service | Where-Object -FilterScript { $PSItem.Status -eq "Running" -and $PSItem.Name -like "s*" }:获取服务信息对象->只获取Status"Running"的,且Names开头
    1. $PSItem代表当前通过|传递的对象
    2. Get-Service每获取到一个服务信息对象都会传递到|后面的cmdlet进行处理
  9. 技巧:先筛选结果再进行其它处理
    1. 例如:Get-Process | Select-Object -Property Handle,CPU | Where-Object -Property Handle -gt 1000 | Sort-Object -Property Handle这里就把筛选延后了,这不是最好的写法,应该先筛选再处理,即Get-Process | Where-Object -Property Handle -gt 1000 | Select-Object -Property Handle,CPU | S ort-Object -Property Handle,越早筛选越好,这样后续管道需要处理的对象数越少

Module_5_深入探讨管道

  1. 管道传输的对象,必需与下一个cmdlet执行的对象相对应

  2. 可以通过get-help来获取cmdlet所支持的可以通过管道传递的参数

  3. 管道传输的几种方式

    1. ByValue:前一个cmdlet执行的对象传递到后一个cmdlet执行的对象,如果对象一样的话,管道会执行成功
    2. ByPropertyName:前一个cmdlet执行的对象的某个属性传递到后一个cmdlet执行的属性参数中,如果属性名一致的话,管道会执行成功
    3. 如果属性名不一致时,可以通过Select-Object来进行属性名重命名来处理,如Get-Process -Name q* | Select-Object -Property Name, @{name='ProcessName'; expression={$PSItem.Name}},为获取所有程中以q开头的进程,然后打印Name属性,且打印一列名为ProcessName的属性,值为$PSItem.Name
  4. 管道优先通过ByValue传递对象,如果对象类型与下一个要执行的cmdlet所需的对象类型不匹配,管道会转而尝试通过ByProperty来传递属性到下一个要执行的cmdlet执行所需的参数中,如果属性名还是不匹配,就需要使用者自行将前一个cmdlet中获取到的对象的感兴趣的属性通过Seclect-Object重命名属性名后再传递到下一个cmdlet

    1. 如何知道下一个cmdlet所需的对象类型或参数属性名是怎样的?通过Get-Help cmdlet -ShowWindow,查看帮助文档可以找到
  5. 如果下一个命令没有能接受管道传输的对象或参数,即不支持直接的系统默认的管道传输时,可以通过将前一个cmdlet执行的结果经处理后直接放置到下一个cmdlet的参数中直接使用,方法如下

    1. Get-ChildItem -Path (Get-Process -Name q* | Select-Object -ExpandProperty Path)即通过q开头的进程的路径来执行Get-ChildItem
    2. Get-ChildItem -Path (Get-Process -Name q*).Path即通过q开头的进程的路径来执行Get-ChildItem,通过获取对象的属性值
    3. Get-Process -Name q* | Get-ChildItem -Path {$PSItem.Path}即通过q开头的进程的路径来执行Get-ChildItem,通过获取$PSItem对象的属性值
  6. Get-CimInstance -ClassName Win32_BIOS:获取本机的BIOS信息

Module_6_在Shell中使用PowerShell远程管理

  1. PowerShell远程管理的安全性
    1. 使用安全的端口
    2. 在域网络中,使用HTTP通信,且使用Kerberos加密
    3. 在互联网或通过防火墙,使用HTTP通信加SSL加密,且二次加密
  2. Enable-PSRemoting:启用远程管理
    1. 需要使用管理员模式启动PowerShell
  3. Enter-PSSession -ComputerName 电脑名:连接远程电脑的PowerShell
  4. Invoke-Command:远程执行命令
  5. Get-Volume:获取磁盘剩余空间
  6. fomat-table:生成表格
    1. 例如Get-Volume | Format-Table -Property DriveLetter,SizeRemaining,size -AutoSize,即只使用DriveLetter,SizeRemaining,size显示,比Select-Object好的地方是可以使用-AutoSize调整显示
  7. Get-Volume | Sort-Object -Property SizeRemaining | Select-Object -Last 3,只显示剩余容量最大的三个磁盘
  8. PoweShell如何使用账号密码远程连接到远程win7
    1. 本机上
      1. 使用管理员权限启动PowerShell
      2. 执行Set-Item WSMan:\localhost\Client\TrustedHosts -Value "远程主机的IP或者电脑名" -Force
    2. 远程Win7
      1. 使用管理员权限启动PowerShell
      2. 执行Enable-PSRemoting -Force
    3. 然后在本机上输入Enter-PSSession -ComputerName "远程主机名" -Credential $credential,按照提示输入账号密码,即可进入远程管理主机模式
    4. 退出远程管理主机模式,执行Exit-PSSession

Module_7_为自动化做好准备

  1. Get-ExecutionPolicy:获取当前PowerShell脚本运行策略
  2. Set-ExecutionPolicy:设置当前PowerShell脚本运行策略
    1. 默认为RemoteSign,最好设置为AllSign
  3. New-SelfSignedCertificate:创建PowerShell脚本自签名证书
  4. Set-AuthenticodeSignature:使用证书对PowerShell脚本进行签名
  5. Get-ChildItem Cert:\CurrentUser -Recurse -CodeSigningCert:获取本机上本用户的签名证书
  6. $开头代表后续为变量名,即PowerShell使用$来区分变量和cmdlet
  7. 如果执行对象方法后,对象的的属性存在问题,则执行一下refresh函数(如果有),再获取对象的属性
  8. read-host:读取命令行输入信息,类比pyhtoninput
  9. write-host:输出信息到命令行,类别pyhtonprint
    1. cmdlet不支持管道
  10. write-object:将对象输出到命令行,支持管道
  11. writ-warning:使用PowerShell警告配色输出信息到命令行
  12. writ-error:使用PowerShell错误配色输出信息到命令行

Module_8_大规模自动化:远程操作

  1. invoke-command只使用电脑名执行命令时,命令执行完毕会自动关闭远程PowerShell
  2. New-PSSession:创建远程PowerShell会话
    1. 使用创建出来的会话来连续执行命令
    2. 操作会话速度会更快
  3. Get-PSSession:获取当前PowerShell会话列表
  4. Measure-Command {命令}:统计命令的执行时间
  5. Copy-Item:复制文件,支持复制本机文件到远程机器或者从远程机器复制文件到本机
  6. Import-PSSession:为会话安装远程主机上的模块,执行该命令并不会在本机上安装对应的模块,模块只对指定会话生效,且会话关闭后,模块文件清空,且模块执行的命令对象为远程主机
    1. 隐式远程代理
    2. Import-PSSession -Session $s -Module Get-Process -Prefix remote,执行后,在当前PowerShell执行的Get-remoteProcess命令得到的结果,等同于Invoke-Command -Session $s {Get-Process}命令得到的结果
  7. Get-Command:获取命令信息

Module_9_脚本和工具制作简介

  1. PowerShell ISE为编写PowerShell脚本的IDE

  2. Get-WmiObject win32_logicaldisk -Filter "DeviceId='C:'":获取C盘的信息

  3. 为脚本增加其它信息

    1. 使用param为脚本增加参数,如

      param(
          $ComputerName = "localhost",
          $bogus
      )
      

      然后就可以Get-WmiObject -ComputerName $ComputerName -class win32_logicaldisk -Filter "DeviceId='C:'"这样在脚本文件中使用参数,且使用get-help 脚本文件时可以看到对应的参数要求

    2. param脚本参数指定类型,默认为object类型,如

      param(
          [string]$ComputerName = "localhost",
          $bogus
      )
      

      使用get-help 脚本文件时可以看到对应的参数ComputerName类型要求变为了string

    3. 为脚本增加默认参数

      [CmdletBinding()]
      param(
          [string]$ComputerName = "localhost",
          $bogus
      )
      

      使用get-help 脚本文件时可以看到除了$ComputerName$bogus参数外,还有[<CommonParameters>]的参数

    4. 改变param脚本参数为强制参数,默认为非强制参数,即不需要提供该参数也可运行,如

      [CmdletBinding()]
      param(
          [Parameter(Mandatory=$True)]
          [string]$ComputerName = "localhost",
          $bogus
      )
      

      使用get-help 脚本文件时可以看到对应的参数ComputerName变为了强制参数,且运行脚本时也会提示为对应的参数提供值

    5. 使用注释为脚本文件增加帮助信息

      <#
      .Synopsis
      短描述的关键字
      This is short description
      .Description
      长描述的关键字
      This is long description
      .Parameter ComputerName
      参数说明
      This is for remote computer's name
      .Example
      例子说明
      diskinfo -ComputerName remote
      This is for a remote computer
      #>
      

      使用get-help 脚本文件时就可以类似于PowerShell默认的命令一样样式的注释了

    6. ISE中使用Ctrl+J,选择Cmdlet(高级功能),就可以在脚本上看到跟4一样的预设好的模板注释了

    7. 函数关键字Funciton,注意函数命名最好跟PowerShellCmdlet的要求一样,即动词-名词形式,例如

      Function Get-DiskInfo {
          [CmdletBinding()]
          param(
              [Parameter(Mandatory=$True)]
              [string[]]$ComputerName = "localhost",
              $bogus
          )
      
          Get-WmiObject -ComputerName $ComputerName -class win32_logicaldisk -Filter "DeviceId='C:'"
      }
      
  4. 在当前PowerShell窗口的堆栈上运行脚本,在脚本路径前加上.即可,例如. D:\DiskInfo.ps1

    1. 默认情况下,运行脚本时,PowerShell会使用新的堆栈来运行脚本,脚本运行完毕后,该堆栈销毁,脚本中的变量和函数都会销毁
    2. 在脚本路径上增加.后,由于在当前PowerShell窗口的堆栈上运行脚本,所以只有在当前当前PowerShell窗口关闭后,脚本中的变量和函数才会销毁
  5. 生成脚本模块文件

    1. 简单方法:脚本后缀修改为psm1即可
      1. 如果模块文件不在特殊路径下,则需要在当前PowerShell窗口中手动导入模块,例如执行Import-Module .\diskinfo.psm1即将diskinfo脚本模块导致当前PowerShell窗口,之后即可使用模块中的元素(使用Import-Module .\diskinfo.psm1 -Verbose可以看到导入模块时的 详细信息)
      2. PowerShell窗口中执行$env:PSModulePath,即可看到特殊路径列表,每次启动PowerShell窗口时,PowerShell均会自动加载特殊路径列表中的模块文件,即我们只需将模块文件放入特殊路径列表中任一路径,后续不用自行手动导入该模块文件就可以使用模块文件中的元素了
        1. 在特殊路径下,创建跟自定义模块文件一样的文件夹后,将自定义模块文件放进该文件夹即可
      3. 使用$env:PSModulePath -split ";"可以更好地看到特殊路径列表
      4. 最好不要将自定义的模块文件放入PowerShell的安装目录下的特殊路径中

上一篇:

下一篇: