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

Powershell:将自定义对象导出到CSV文件-使用“选择对象”提取单个属性值,powershell,export-to-csv,select-object,Powershell,Export To Csv,Select Object,我编写了一个脚本,用于构造自定义对象并将其导出到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

我编写了一个脚本,用于构造自定义对象并将其导出到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}”

是否可以除去不需要的
@{=…}
包装器?

表达式:

Select-Object {$_.LastWriteTime}
输出具有名称为
$\uLastWriteTime
的单个属性的对象。解决此问题的最简单方法是使用
-ExpandProperty
参数,该参数将只输出您感兴趣的值。e、 g:

$date86 = Get-ItemProperty 'C:\Program Files (x86)\McAfee'|
            Select-Object -ExpandProperty LastWriteTime 
请注意,我还从
选择对象
命令中删除了脚本块,因为它不是必需的。

补充[1] 有其他选择:

如果只需要给定对象属性的值,只需将命令包装在
(…)
中并使用

在PSv3+中,上述命令还可用于返回多个项(数组)的命令,在这种情况下,将输出输入项的单个属性值的数组-此功能被调用


PSv3为每个对象
%
/
引入了一种快捷语法
(还有
/
其中的对象
),也可以在此处使用:

Get-ItemProperty 'C:\Program Files\McAfee' | % LastWriteTime # ditto
这相当于更详细的(也适用于PSv2-):

这两种基于管道的语法形式速度较慢,但有两个优点:

  • 为了保持内存使用恒定,大型输入集合最好在管道中逐个处理(如果可行,如果需要在内存中收集整个输出,则没有优势)

  • 此语法明确引用单个项的属性,而不是集合的整体属性

    • 例如,
      (Get ChildItem-File C:\Windows).Length
      返回
      C:\Windows
      中的文件计数,因为
      Length
      被解释为集合的(数组)属性
      相反,
      getchilditem-filec:\Windows |%Length
      返回单个文件的
      .Length
      (文件大小)属性值数组
最后,在PSv4+中,您还可以使用,它不使用管道,因此速度更快(虽然略慢于成员枚举),但与成员枚举一样,要求输入集合完全位于内存中:

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

[1] 快速概述的行为

  • 选择对象[-Property]
    为每个输入对象返回一个自定义对象,仅包含指定的属性;即使只指定了一个特性,结果也是具有该特性的自定义对象,而不是特性值本身

  • 相反,使用
    -ExpandProperty
    会从每个输入对象(按原样键入)返回给定的单个属性值

一个简单的示例:从
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*
(Get-ItemProperty 'C:\Program Files\McAfee').ForEach('LastWriteTime')
# 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*