1

我编写了一个构建自定义对象并将其导出到 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>=...}包装?

4

2 回答 2

1

表达方式:

Select-Object {$_.LastWriteTime}

输出具有 name 的单个属性的对象$_.LastWriteTime。修复它的最简单方法是使用-ExpandProperty仅输出您感兴趣的值的参数。例如:

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

请注意,我还从Select-Object命令中删除了脚本块,因为它不是必需的。

于 2016-07-12T00:06:47.330 回答
1

用替代方案补充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的数组。.Length

最后,在 PSv4+ 中,您还可以使用.ForEach()collection方法,它不使用管道,因此速度更快(虽然比成员枚举稍慢),但与成员枚举一样,要求输入集合完全在内存中:

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

Select-Object[1]的行为快速概览:

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

  • 相比之下, using从每个输入对象(按原样键入)-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*
于 2016-07-12T02:23:26.027 回答