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
命令中删除了脚本块。