【问题标题】:powershell extend an objectpowershell 扩展一个对象
【发布时间】:2013-05-15 13:04:21
【问题描述】:

如何在 PowerShell 中向对象添加列?

例如,Get-Childitem 返回一个对象,带有 Mode、LastWriteTime、Length Name 等...... 我想用一个额外的列来扩展这个对象,它是从 LastWriteTime 计算出来的。

这是原始的 Get-Childitem 输出:

Mode                LastWriteTime     Length Name                                                                                                                                                        
----                -------------     ------ ----                                                                                                                                                        
-a---       2012.12.15.     17:02       5390 Log_20121215.txt                                                                                                                       
-a---       2013.01.02.     17:10      14014 Log_20130102.txt                                                                                                                
-a---       2013.01.07.     17:08       2200 Log_20130107.txt

我想要这个输出:

Mode                LastWriteTime     Length Name                      ComputedColumn                                                                                                                                  
----                -------------     ------ ----                      --------------                                                                                                                                  
-a---       2012.12.15.     17:02       5390 Telenor_Log_20121215.txt  20131215                                                                                                                                  
-a---       2013.01.02.     17:10      14014 Telenor_Log_20130102.txt  20140102                                                                                                                                  
-a---       2013.01.07.     17:08       2200 Telenor_Log_20130107.txt  20140207

感谢您的帮助。

【问题讨论】:

    标签: object powershell extend get-childitem


    【解决方案1】:

    根据需要使用Add-Member 或select 中的自定义表达式。

    计算和存储。保留原始对象,但添加一个自定义列

    $data = dir | % { Add-Member -InputObject $_ -MemberType NoteProperty -Name "ComputedColumn" -Value $_.LastWriteTime.AddYears(1).ToString("yyyyMMdd") -PassThru }
    

    在显示(或导出到 csv 等)之前计算它

    dir | select Mode, LastWriteTime, Length, Name, @{name="ComputedColumn";expression={ $_.LastWriteTime.AddYears(1).ToString("yyyyMMdd") }}
    

    例如。使用格式表正确显示

    dir | select Mode, LastWriteTime, Length, Name, @{name="ComputedColumn";expression={ $_.LastWriteTime.AddYears(1).ToString("yyyyMMdd") }} | ft -AutoSize
    
    
    Mode  LastWriteTime       Length Name                    ComputedColumn
    ----  -------------       ------ ----                    --------------
    d-r-- 14.04.2013 17:47:18        Contacts                20140414      
    d-r-- 15.05.2013 14:19:45        Desktop                 20140515      
    d-r-- 14.04.2013 18:03:33        Documents               20140414      
    d-r-- 11.05.2013 18:22:57        Downloads               20140511      
    

    【讨论】:

      【解决方案2】:

      扩展对象的最简单方法是将其通过管道传送到 cmdlet Select-Object。请参阅下面的示例。

      # Add the extended property IsVeryBig
      Get-ChildItem c:\temp | Select-Object *, IsVeryBig | 
      
          ForEach-Object { $_.IsVeryBig = $True }
      

      【讨论】:

      • 要小心,因为select 与Add-Member 不同,它使用指定的列创建一个新的自定义对象,因此如果他需要将它们通过管道传递给另一个 cmdlet,它将无法工作。
      • 是的,我同意。如果需要在过程中维护Object类型,则需要使用Add-Member cmdlet。
      猜你喜欢
      • 2011-09-21
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      相关资源
      最近更新 更多