PowerShell的:导出自定义对象到CSV文件 - 提取与选择 - 对象的单一属性值PowerS

2019-05-12 13:03发布

我写了构造一个自定义对象,并将其导出为CSV文件的脚本:

$reg = Get-ItemProperty HKLM:\SOFTWARE\McAfee\DLP\Agent | Select-Object agentversion

$date = Get-ItemProperty 'C:\Program Files\McAfee' | Select-Object {$_.LastWriteTime} 

$date86 = Get-ItemProperty 'C:\Program Files (x86)\McAfee'| Select-Object {$_.LastWriteTime}

New-Object -TypeName pscustomobject -Property @{
  "Number1"=$reg
  "Number2"=$date86
  "Number3"=$date } | export-csv -Path C:\****\desktop\stuff.csv -NoTypeInformation

然后在出现的CSV文件中的数据行:

“{@} AgentVersion = 9.4.112.22”, “@ {$ .LastWriteTime = 2016年5月6日上午06时02分32秒}”,“@ {$ .LastWriteTime = 2016年7月5日下午8时34分01秒}“

是否有可能摆脱不必要的@{<name>=...}包装?

Answer 1:

表达方式:

Select-Object {$_.LastWriteTime}

输出与名称的单一属性的对象$_.LastWriteTime 。 要解决这个问题最简单的方法是使用-ExpandProperty参数,将只输出你感兴趣的值,例如:

$date86 = Get-ItemProperty 'C:\Program Files (x86)\McAfee'|
            Select-Object -ExpandProperty LastWriteTime 

请注意,我也从删除的脚本块Select-Object命令,因为这是没有必要的。



Answer 2:

为了补充zdan的有用的答案与备选方案[1]:

如果你只是想给定对象的财产的价值 ,简单地包裹在命令(...)并使用.<propertyName>

(Get-ItemProperty 'C:\Program Files\McAfee').LastWriteTime # returns a [datetime] instance

在PSv3 +,上面还与命令返回多个项目(阵列),在这种情况下,输入项的个别属性值数组输出-该功能被称为构件枚举 。


PSv3推出的快捷语法% / ForEach-Object (也? / Where-Object ),可以在这里也被利用:

Get-ItemProperty 'C:\Program Files\McAfee' | % LastWriteTime # ditto

这是更详细的等效(这也适用于PSv2-):

Get-ItemProperty 'C:\Program Files\McAfee' | % { $_.LastWriteTime }

这两个基于管线的语法形式是比较慢的,但有两个优点:

  • 大的输入集合,以保持内存使用恒定管道逐一更好处理(如果可行的话;如果你需要收集在内存中的整个输出,没有任何优势)。

  • 这句法明确引用单个项目的属性,而不是作为一个整体集合的性质。

    • 例如, (Get-ChildItem -File C:\Windows).Length返回文件的计数 C:\Windows ,因为Length被解释为集合的(数组的)财产;
      相比之下, Get-ChildItem -File C:\Windows | % Length Get-ChildItem -File C:\Windows | % Length返回单个文件的阵列.Length (文件大小)的属性值。

最后,在PSv4 +,你也可以使用.ForEach()收集方法 ,不使用管道,因此速度更快(虽然比成员枚举稍微慢一点),但是,像会员枚举,要求输入集合在内存全:

(Get-ItemProperty 'C:\Program Files\McAfee').ForEach('LastWriteTime')

[1]简要概述Select-Object的行为

  • Select-Object [-Property] <string[]>返回对每一输入对象的自定义对象 ,一个只包含指定属性; 即使只指定一个属性,该结果与单一属性自定义对象,而不是属性值本身。

  • 相反,使用-ExpandProperty <string>返回从每个输入对象,而不是给定的,单属性的 (输入原样)。

一个简单的例子:解压Year从属性值Get-Date电话:

# WRONG: with (implied) -Property
PS> $val = Get-Date | Select-Object Year; "$val"
@{Year=2018}  # !!
# A custom object with a Year property was returned and the above is its
# string representation, the equivalent of:
#      "$([pscustomobject] @{ Year = 2018 })"

# CORRECT: with -ExpandProperty
PS> $val = Get-Date | Select-Object -ExpandProperty Year; "$val"
2018  # OK: -ExpandProperty extracted just the property's *value*


文章来源: Powershell: Export a custom object to a CSV file - extract a single property value with Select-Object