当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于计算属性

作者:精品下载站 日期:2024-12-14 02:24:33 浏览:14 分类:玩电脑

关于计算属性


简短描述

PowerShell 提供了动态添加新属性和更改输出到管道的对象格式的功能。

详细描述

多个 PowerShell cmdlet 使用允许向这些输出对象添加新属性的参数将输入对象转换、分组或处理为输出对象。您可以使用这些参数根据输入对象的值在输出对象上生成新的计算属性。计算属性由哈希表定义,该哈希表包含指定新属性名称的键值对、计算值的表达式以及可选的格式设置信息。

支持的 cmdlet

以下 cmdlet 支持 Property 参数的计算属性值。 Format-* cmdlet 还支持 GroupBy 参数的计算值。

以下列表列出了支持计算属性的 cmdlet 以及每个 cmdlet 支持的键值对。

  • 比较对象

      expression
  • 转换为 Html

    • name/label - 可选(在 PowerShell 6.x 中添加)
  • expression
  • 宽度 - 可选
  • 对齐 - 可选
  • 格式自定义

      expression
    • 深度 - 可选
    • 格式列表

      • 名称/标签 - 可选
    • expression
    • formatstring - 可选
    • 这组相同的键值对还适用于传递给所有 Format-* cmdlet 的 GroupBy 参数的计算属性值。

    • 格式表

      • 名称/标签 - 可选
    • expression
    • formatstring - 可选
    • 宽度 - 可选
    • 对齐 - 可选
    • 格式范围

        expression
      • formatstring - 可选
      • 组对象

          expression
        • 测量对象

          • 仅支持表达式的脚本块,不支持哈希表。
        • PowerShell 5.1 及更早版本不支持。
        • 选择对象

          • 名称/标签 - 可选
        • expression
        • 排序对象

            expression
          • 升序/降序 - 可选
          • 笔记

            表达式的值可以是脚本块而不是哈希表。有关详细信息,请参阅注释部分。

            哈希表键定义

            • name/label - 指定正在创建的属性的名称。您可以互换使用name或其别名label
            • 表达式 - 用于计算新属性值的字符串或脚本块。如果 表达式 是字符串,则该值将解释为输入对象的属性名称。这是一个比 expression={ $_. } 更短的选项。
            • alignment - 由生成表格输出的 cmdlet 使用,以定义值在列中的显示方式。该值必须是'left''center''right'
            • formatstring - 指定格式字符串,用于定义值的输出格式。有关格式字符串的详细信息,请参阅 .NET 中的格式类型。
            • width - 指定显示值时表中列的最大宽度。该值必须大于0
            • 深度 - Format-CustomDepth 参数指定所有属性的扩展深度。 深度 键允许您指定每个属性的扩展深度。
            • 升序/降序 - 允许您指定一个或多个属性的排序顺序。这些是布尔值。

            只要指定的名称前缀明确,您就不需要拼写出哈希表键。例如,您可以使用 n 代替 Name,使用 e 代替 Expression

            示例

            Compare-Object

            通过计算属性,您可以控制如何比较输入对象的属性。在此示例中,不是直接比较这些值,而是将这些值与算术运算的结果(模 2)进行比较。

            Compare-Object @{p=1} @{p=2} -property @{ Expression = { $_.p % 2 } }
            
             $_.p % 2  SideIndicator
            ---------- -------------
                     0 =>
                     1 <=
            

            ConvertTo-Html

            ConvertTo-Html 可以将对象集合转换为 HTML 表格。计算属性允许您控制表格的呈现方式。

            Get-Alias |
              ConvertTo-Html Name,
                             Definition,
                             @{
                                name='ParameterCount'
                                expr={$_.Parameters.Keys.Count}
                                align='center'
                             } |
                Out-File .\aliases.htm -Force
            

            此示例创建一个 HTML 表,其中包含 PowerShell 别名列表以及每个别名命令的数字参数。 ParameterCount 列的值居中。

            Format-Custom

            Format-Custom 以类似于类定义的格式提供对象的自定义视图。更复杂的对象可以包含与复杂类型深度嵌套的成员。 Format-CustomDepth 参数指定所有属性的扩展深度。 深度 键允许您指定每个属性的扩展深度。

            在此示例中,深度 键简化了Get-Date cmdlet 的自定义输出。 Get-Date 返回一个 DateTime 对象。该对象的Date属性也是一个DateTime对象,因此该对象是嵌套的。

            Get-Date | Format-Custom @{expr={$_.Date};depth=1},TimeOfDay
            
            class DateTime
            {
              $_.Date =
                class DateTime
                {
                  Date = 8/7/2020 12:00:00 AM
                  Day = 7
                  DayOfWeek = Friday
                  DayOfYear = 220
                  Hour = 0
                  Kind = Local
                  Millisecond = 0
                  Minute = 0
                  Month = 8
                  Second = 0
                  Ticks = 637323552000000000
                  TimeOfDay = 00:00:00
                  Year = 2020
                  DateTime = Friday, August 07, 2020 12:00:00 AM
                }
              TimeOfDay =
                class TimeSpan
                {
                  Ticks = 435031592302
                  Days = 0
                  Hours = 12
                  Milliseconds = 159
                  Minutes = 5
                  Seconds = 3
                  TotalDays = 0.503508787386574
                  TotalHours = 12.0842108972778
                  TotalMilliseconds = 43503159.2302
                  TotalMinutes = 725.052653836667
                  TotalSeconds = 43503.1592302
                }
            }
            

            Format-List

            在此示例中,我们使用计算属性来更改 Get-ChildItem 输出的名称和格式。

            Get-ChildItem *.json -File |
              Format-List Fullname,
                          @{
                             name='Modified'
                             expression={$_.LastWriteTime}
                             formatstring='O'
                          },
                          @{
                             name='Size'
                             expression={$_.Length/1KB}
                             formatstring='N2'
                          }
            
            FullName : C:\Git\PS-Docs\PowerShell-Docs\.markdownlint.json
            Modified : 2020-07-23T10:26:28.4092457-07:00
            Size     : 2.40
            
            FullName : C:\Git\PS-Docs\PowerShell-Docs\.openpublishing.publish.config.json
            Modified : 2020-07-23T10:26:28.4092457-07:00
            Size     : 2.25
            
            FullName : C:\Git\PS-Docs\PowerShell-Docs\.openpublishing.redirection.json
            Modified : 2020-07-27T13:05:24.3887629-07:00
            Size     : 324.60
            

            Format-Table

            在此示例中,计算属性添加了一个 Type 属性,用于按内容类型对文件进行分类。

            Get-ChildItem -File |
              Sort-Object extension |
                Format-Table Name, Length -GroupBy @{
                  name='Type'
                  expression={
                    switch ($_.extension) {
                      '.md'   {'Content'}
                      ''      {'Metacontent'}
                      '.ps1'  {'Automation'}
                      '.yml'  {'Automation'}
                      default {'Configuration'}
                    }
                  }
                }
            
               Type: Metacontent
            
            Name              Length
            ----              ------
            ThirdPartyNotices   1229
            LICENSE-CODE        1106
            LICENSE            19047
            
               Type: Configuration
            
            Name                                Length
            ----                                ------
            .editorconfig                          183
            .gitattributes                         419
            .gitignore                             228
            .markdownlint.json                    2456
            .openpublishing.publish.config.json   2306
            .openpublishing.redirection.json    332394
            .localization-config                   232
            
               Type: Content
            
            Name            Length
            ----            ------
            README.md         3355
            CONTRIBUTING.md    247
            
               Type: Automation
            
            Name                      Length
            ----                      ------
            .openpublishing.build.ps1    796
            build.ps1                   7495
            ci.yml                       645
            ci-steps.yml                2035
            daily.yml                   1271
            

            Format-Wide

            Format-Wide cmdlet 允许您将集合中对象的一个属性值显示为多列列表。

            对于此示例,我们希望将文件名和大小(以千字节为单位)视为宽列表。由于Format-Wide 不会显示多个属性,因此我们使用计算属性将两个属性的值合并为一个值。

            Get-ChildItem -File |
              Format-Wide -Property @{e={'{0} ({1:N2}kb)' -f $_.name,($_.length/1kb)}}
            
            .editorconfig (0.18kb)                          .gitattributes (0.41kb)
            .gitignore (0.22kb)                             .localization-config (0.23kb)
            .markdownlint.json (2.40kb)                     .openpublishing.build.ps1 (0.78kb)
            .openpublishing.publish.config.json (2.25kb)    .openpublishing.redirection.json (324.60kb)
            build.ps1 (7.32kb)                              ci.yml (0.63kb)
            ci-steps.yml (1.99kb)                           CONTRIBUTING.md (0.24kb)
            daily.yml (1.24kb)                              LICENSE (18.60kb)
            LICENSE-CODE (1.08kb)                           README.md (3.28kb)
            ThirdPartyNotices (1.20kb)
            

            Group-Object

            Group-Object cmdlet 根据指定属性的值按组显示对象。在此示例中,计算的属性对每种内容类型的文件数量进行计数。

            Get-ChildItem -File |
              Sort-Object extension |
                Group-Object -NoElement -Property @{
                  expression={
                    switch ($_.extension) {
                      '.md'   {'Content'}
                      ''      {'Metacontent'}
                      '.ps1'  {'Automation'}
                      '.yml'  {'Automation'}
                      default {'Configuration'}
                    }
                  }
                }
            
            Count Name
            ----- ----
                5 Automation
                7 Configuration
                2 Content
                3 Metacontent
            

            Measure-Object

            Measure-Object cmdlet 计算对象的数字属性。在此示例中,我们使用计算属性来获取 1 到 10 之间可被 3 整除的数字的计数 (Sum)。

            1..10 | Measure-Object -Property {($_ % 3) -eq 0} -Sum
            
            Count             : 10
            Average           :
            Sum               : 3
            Maximum           :
            Minimum           :
            StandardDeviation :
            Property          : ($_ % 3) -eq 0
            

            笔记

            与其他 cmdlet 不同,Measure-Object 不接受计算属性的哈希表。您必须使用脚本块。

            Select-Object

            您可以使用计算属性通过 Select-Object cmdlet 将其他成员添加到对象输出中。在此示例中,我们列出了以字母 C 开头的 PowerShell 别名。使用Select-Object,我们输出别名、它映射到的 cmdlet 以及为 cmdlet 定义的参数数量的计数。使用计算属性,我们可以创建 ParameterCount 属性。

            $aliases = Get-Alias c* |
              Select-Object Name,
                            Definition,
                            @{
                                name='ParameterCount'
                                expr={$_.Parameters.Keys.Count}
                            }
            $aliases | Get-Member
            $aliases
            
               TypeName: Selected.System.Management.Automation.AliasInfo
            
            Name           MemberType   Definition
            ----           ----------   ----------
            Equals         Method       bool Equals(System.Object obj)
            GetHashCode    Method       int GetHashCode()
            GetType        Method       type GetType()
            ToString       Method       string ToString()
            Definition     NoteProperty string Definition=Get-Content
            Name           NoteProperty string Name=cat
            ParameterCount NoteProperty System.Int32 ParameterCount=21
            
            Name    Definition         ParameterCount
            ----    ----------         --------------
            cat     Get-Content                    21
            cd      Set-Location                   15
            cdd     Push-MyLocation                 1
            chdir   Set-Location                   15
            clc     Clear-Content                  20
            clear   Clear-Host                      0
            clhy    Clear-History                  17
            cli     Clear-Item                     20
            clp     Clear-ItemProperty             22
            cls     Clear-Host                      0
            clv     Clear-Variable                 19
            cnsn    Connect-PSSession              29
            compare Compare-Object                 20
            copy    Copy-Item                      24
            cp      Copy-Item                      24
            cpi     Copy-Item                      24
            cpp     Copy-ItemProperty              23
            cvpa    Convert-Path                   13
            

            Sort-Object

            使用计算的属性,您可以按属性按不同的顺序对数据进行排序。此示例按日期升序对 CSV 文件中的数据进行排序。但在每个日期内,它都会按 售出数量 降序对行进行排序。

            Import-Csv C:\temp\sales-data.csv |
              Sort-Object Date, @{expr={$_.UnitsSold}; desc=$true}, Salesperson  |
                Select-Object Date, Salesperson, UnitsSold
            
            Date       Salesperson UnitsSold
            ----       ----------- ---------
            2020-08-01 Sally       3
            2020-08-01 Anne        2
            2020-08-01 Fred        1
            2020-08-02 Anne        6
            2020-08-02 Fred        2
            2020-08-02 Sally       0
            2020-08-03 Anne        5
            2020-08-03 Sally       3
            2020-08-03 Fred        1
            2020-08-04 Anne        2
            2020-08-04 Fred        2
            2020-08-04 Sally       2
            

            笔记

            • 您可以直接指定表达式脚本块作为参数,而不是将其指定为哈希表中的Expression条目。例如:

              '1', '10', '2' | Sort-Object { [int] $_ }
              

              此示例对于不需要(或支持)通过 Name 键命名属性的 cmdlet 来说很方便,例如 Sort-ObjectGroup-Object测量对象

              对于支持命名属性的 cmdlet,脚本块将转换为字符串并用作输出中的属性名称。

            • Expression 脚本块在作用域中运行,这意味着调用者的变量不能直接修改。

            • 管道逻辑应用于 Expression 脚本块的输出。这意味着输出单元素数组会导致该数组被展开。

            • 对于大多数 cmdlet,表达式脚本块内的错误会被悄悄忽略。对于 Sort-Object,语句终止和脚本终止错误是输出,但它们不会终止语句。

            参见

            • about_Hash_Tables
            • ConvertTo-Html
            • Format-Custom
            • Format-List
            • Format-Table
            • Format-Wide
            • Compare-Object
            • Group-Object
            • Measure-Object
            • Select-Object
            • Sort-Object
            • .NET 中的格式类型

            您需要 登录账户 后才能发表评论

            取消回复欢迎 发表评论:

            关灯