Powershell:将自定义对象导出到CSV文件-使用Select-Object提取单个属性值




export-to-csv (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 返回 (Get-ChildItem -File C:\Windows).Length 的文件 ,因为 Length 被解释为 集合 的(数组的)属性。
      相比之下, Get-ChildItem -File C:\Windows | % Length Get-ChildItem -File C:\Windows | % Length 返回单个文件的 .Length (文件大小)属性值的数组。

最后,在PSv4 +中,您还可以使用.ForEach .ForEach() 收集 方法 ,该 方法 不使用管道,因此速度更快(尽管比成员枚举稍慢),但是,像成员枚举一样,要求输入集合位于内存已满:

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

[1]快速了解 Select-Object 的行为

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

  • 相比之下,使用 -ExpandProperty <string> 从每个输入对象(按原样键入)返回给定的单个属性的

一个简单的示例:从 Get-Date 调用中提取 Year 属性值:

# 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*

我编写了一个脚本,该脚本构造了一个自定义对象并将其导出到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 = 5/6/2016 6:02:32 AM}”,“ @ {$ .LastWriteTime = 7/5/2016 8:34:01 PM }”

是否可以摆脱不需要的 @{<name>=...} 包装器?


表达方式:

Select-Object {$_.LastWriteTime}

输出具有名称 $_.LastWriteTime 的单个属性的对象。 解决该问题的最简单方法是使用 -ExpandProperty 参数,该参数将仅输出您感兴趣的值。例如:

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

注意,由于没有必要,我还从“ Select-Object 命令中删除了脚本块。





select-object