参考

  • 官方文档
  • 书籍:
    • 入门:Windows Powershell 实战指南,ISBN: 9787115409676
    • 入门:PowerShell 101,电子版,英文,免费
    • 技巧:Learning PowerShell,电子版,英文,免费
  • 网站:
    • powershell.org,同 Youtube 频道

概要和版本

  • 用于处理命令行,以及避免重复劳动。
  • 面向对象
  • 发布地址:GitHub
  • 使用$PSVersionTable查看安装的版本。
  • 目前(2021-09-16)最新版本为 7

安装和配置路径

Chocolaty

  • choco install powershell-core -y

Modules

  • 这些模组来自 PSGallery,如果提示需要信任,选择信任。一劳永逸的方案:
Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted
  • 一些常用的软件
Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck
Install-Module oh-my-posh -Scope CurrentUser
Install-Module posh-git -Scope CurrentUser

配置文件位置

  • Module -Scope CurrentUser : $HOME\\Documents\\PowerShell\\Modules
  • Module:$env:ProgramFiles\\PowerShell\\Modules
  • Powershell Modules:$PSHOME\\Modules
  • $Profile:Documents\\PowerShell

要点

  • 使用哲学:不能用 Cmdlet 完成,就用 GUI。

Cmdlet 结构:命令 -参数名 参数值

  • 参数名只要输入可以辨识的头几个字母即可,如-computername可以写成-com
  • 命令使用动词(但不完全是),参数名使用单数名词
    • 动词:Get 获得,Remove删除,Set设定(已有)的值,Out输出为文件,Write写入屏幕或者管道,New新建
  • 命令的别名可以用get-aliase找到
  • 参数的别名:(Get-Command <cmdlet> | select -ExpandProperty parameters).<parameter>.aliaes
  • 常用参数:在命令的帮助中显示为[<CommonParameter>]
    • -WhatIF-wi
    • -Confirm-cf

.Net 库方法结构

  • [类名称]::方法(参数)
  • 静态方法可以直接调用,而非静态的方法需要提前创建一个实例:如

      ```
      $object = [System.DateTime]::Now
      $object.AddHours(15)
      ```
    
  • 常用如 URI 的编码和解码
  • [System.Web.HttpUtility]::UrlEncode() & [System.Web.HttpUtility]::UrlDecode()

兼容

  • 命令后加--%会使用原封不动传输给 CMD

命令

  1. Cmdlet:Command-let
  2. 函数
  3. 工作流
  4. 应用程序,是外部的可执行程序

特殊符号

  • 参数值若接受数组,用逗号,分隔
  • 上标符号(Escape 键位)用于转义,帮助信息在about_escape
  • 单引号用于包含空格的字符串,单引号中的一切都为字符串
  • 双引号"中,变量会被处理,$()表示将其中的值作为命令处理
  • 哈希表@{key = value; key1 = value2},用于格式化键与值,例如Import-CSV .\New.csv | Select-Object -Porperty *,@{name = 'Name';expression = {$_.login}
    • 使用.add{}可以添加表的属性
  • @变量,原封不动传输变量的表给命令,如
    $var = @{ComputerName = "StackOverflow-PC"}
    Get-Process -Name "iexplore" @MyParameters
    
  • @(a,b)数组,注意和哈希表括号类型不同
  • ()表示优先处理括号内命令,用于方法后表示接受参数值
  • $声明变量
  • {}块,包含的东西会被视为一个整体,然后输出结果,例如声明带空格的变量,${var with space}
  • []预定义的参数值,比如说[int32]$var 指定特定格式的变量,\$var[0]用于指定数组的第一个值
  • .使用某个对象的属性或方法,属性可用gm找出
  • &传递给 CMD 运行,或者直接执行变量中的文本,而非显示,即Invoke
  • >out-file的缩写
  • ?Where-Object的简写
  • %For-EachObject的简写
  • |表示管道
  • Powershell 命令不区分大小写

变量

  • 使用$引出变量
  • 一些预先定义的变量
    • $True$False是布尔值
    • $null空值
    • $_用于表示在管道中的对象,是$PSItem的简写
    • $env:<PathName>引用系统变量

帮助系统

  • CLI - command-line interfaces
  • Get-Command:获得 Cmdlet(Command-let,是 Powershell 独有的说法)
  • help 是一个函数,作用和Get-help一样,help Get-help -Parameter Name
    • -ShowWindow 在另一个窗口打开
    • -Parameter 指定参数
    • -full 全部教程
    • -online 在线版本
    • -example 示例
  • 使用Update-help更新本地帮助文件
  • Show-command图形化的补全命令方式
  • 阅读帮助:
    • 一个参数集合可以一同使用,不能混用
    • 可选 & 必选
      • 可选参数:用[]包括
        • 当参数名被[]包括,而参数值被<>包括,则是位置参数,可以省略参数名
      • 必选参数:尖括号<>包括
    • 开关参数:只有参数名的参数

提供程序

  • 类似于文件夹,将对象放进一个个容器,容器里面有各种可操作的对象
    • Powershelll 将一切视为一种对象,管道直至末尾传输都都是以对象为行,各种属性和方法为列的表 —— 集合
    • 属性和方法可以用Get-member看到

扩展

  • 两种,模块和管理单元
  • 管理单元 PSSnapin,可以 Get,Add
  • 模块,Module,只要在目录env:psmodulepath中,即可查找并使用,不需要注册
    • 在<powershellgallery.com>可以找到在线的模块
    • Find-moduleInstall-moduleupdate-module

排序、过滤、比较与筛选

  • Sort-Object:排序
  • 左过滤,即在命令中(靠左侧)预先过滤,例如ps -name note*,与之相对是传输到其他命令过滤。
  • Select-Object只显示某些属性值,对属性过滤
  • Where-Object是用属性对项进行过滤
  • 比较
    • 比较输出的 Typename 是布尔
    • 运算符可以加c表示对大小写敏感,如a -eq A是真,但a -ceq A是假
      • -eq-ne-ge-le-gt-lt:表示等于,不等于,大于等于,小于等于,大于,小于
      • -like-notlike,是不是,接受通配符
      • -match-notmatch,和正则表达式比较
      • -and-or和与或
  • Where-Object:过滤单个对象
  • Foreach-Object:对每一个对象进行匹配

输入和输出

  • 输入
    • Read-HostWrtie-Host,在终端屏幕中获取输出信息
    • Get-Credential获取密钥输入,使用用户凭据进行加密
    • Wrtie-Output,将输出写入管道
    • 在窗口中获取用户输入:
      [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
      $var = [Microsoft.VisualBasic.Interaction]::InputBox('Enter something','Title`,'Default')
      
  • 以特定格式导出/导入
    • Export-CSVExport-ClixmlImport-CSVImport-Clixml
    • ConvertTO-HTML,可以用Out-file产生文件

管道

  • | 表示,管道传输的是对象的集合
  • 管道接受两种输入形式
    • ByValue:根据传输集合的的类型,例如,Get-Service | Stop-Service。同名词的命令大多可以这么使用
    • ByProperty:根据参数接受的类型

运算和表达

  • 运算符号有:
    +
    -
    *
    /
    %
    
  • 逻辑运算
    -and
    -or
    -xor
    -not
    ! # 是-not的简写形式`
    
  • 其他
    • a -replace b,c替换
    • a -match b匹配

后台运行,异步作业

  • Start-job 接代码块,使用Recieve等名词获得任务信息
    • $job | Wait-Job | Receive-Job获取结果

条件和循环

条件

  • if(){}eles{}
  • if(){}elseif{}
  • switch(变量){
    条件一 {}
    条件二 {}
    }
    

循环

  • for(起始;条件;重复动作){}
  • <Collection> | Foreach-Object { 使用 $_ 表示单个项}接受管道输入
  • `foreach( in ) {}
  • `.foreach({})
  • while(){}
  • do{}while()
  • do{}until()
  • {Break}表示终止循环

脚本

Function

  • Function 名称<(参数)>{命令},可以重复使用的命令块,脚本中的脚本

前提和帮助

  • #requies写在帮助的第一个,声明本脚本需要的条件
    • #require -version 5 Powershell 至少需要 5
    • #require -RunAsAdministrator,管理员权限运行
  • 多行注释用<# #>,单行用#

执行策略

  • 想要运行脚本,必须更改执行策略
    • 全局用Set-ExecutionPolicy -ExecutionPolicy RemoteSigned更改为允许执行受信任的脚本。
    • 一次性运行,使用Powershell.exe -ExecutionPolicy Bypass;或 Set-ExecutionPolicy Bypass Process

脚本参数

  • param($var)规定参数,参数名前加[参数名< = 参数值>]规定变量,例如param([Parameter(mandatory=$True)][Alias('hostname')][string]$var)
    • mandatory=$True,强制的参数
    • Alias()参数别名
    • Parameter(ParameterSetName = )参数关联
    • Parameter(Position = 1)参数位置
    • [ValidateSet('1','2','3',IgnoreCase),指定参数集

等待外部命令完成

  • & gui_app.exe | Out-Null
  • Start-Process gui_app.exe -Wait

进度和结果

  • 进度:$PSCmdlet.ShouldProcess("Target")
    • 脚本前叫[CmdletBinding(SupportsShouldProcess = $true)]
  • 可以借助其他程序,例如:
    $wshell = New-Object -ComObject Wscript.Shell
    $wshell.Popup("something")