PowerShell -ExpandProperty和正确的日期格式

时间:2018-11-10 11:22:26

标签: powershell select-object

我正在尝试使用PowerShell中的-ExpandProperty功能来停止标题出现在输出中,并格式化日期,而没有分钟和秒。这只是为了获取AD对象的创建日期:

Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created |
  Select-Object -ExpandProperty @{Name="Created";Expression={$_.Created.ToString("yyyy-MM-dd")}} 

这不会产生结果,只有当我排除"-ExpandProperty"部分时,它才会产生正确的日期格式,但包含我不希望的标题"Created"

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在PowerShell中,几乎总是有不止一种解决方案-

(Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created | 
  Select-Object @{N="Created";E{$_.Created.ToString("yyyy-MM-dd")}} ).Created

Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created | 
  Select-Object @{N="Created";E{$_.Created.ToString("yyyy-MM-dd")}} |
    Select-Object -Expand Created

只要可以唯一标识参数名称,就可以将其缩写,并且还存在快捷方式(大写字母),因此-EA是-ErrorAction

IMO的计算属性没有意义,因为它是唯一的输出,因此也应该这样做:

Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created | 
  ForEach-Object {$_.Created.ToString("yyyy-MM-dd")}

答案 1 :(得分:1)

互补 LotPings' helpful answer,它提供了有效的解决方案:

关于 为什么您的代码无效

尽管Select-Object的{​​{1}}参数接受定义calculated properties(例如在您的代码中)的哈希表,但 -Property参数仅接受属性 name 作为 string

因此,您的哈希表只是 stringized ,导致字符串文字-ExpandProperty,导致System.Collections.Hashtable抱怨,因为该名称没有属性。

Select-Object目的是仅输出属性 value 而不是具有该属性的自定义对象
因此,您不需要通过-ExpandProperty绕行,而只需直接使用Select-Object使用值输出脚本块-{ $_.Created.ToString("yyyy-MM-dd") } ,如下所示LotPings回答的底部。


但是,您使用ForEach-Object会放弃一项晦涩的功能:ForEach-Object允许 Select-Object-ExpandProperty组合在一起,在这种情况下通过-Property指定的属性将作为-Property成员添加到通过NoteProperty指定的属性的 value

-ExpandProperty

请注意,输出 string PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } | Select-Object -ExpandProperty one -Property two; $val; $val.two uno 2 附加了输入对象的'uno'属性的副本。

要使用.two进行仿真,需要做更多的工作:

ForEach

答案 2 :(得分:0)

我目前无法访问广告,但这可能就是您想要的

已更新

Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created | Select-Object Created | ForEach-Object {$_.Created.ToString("yyyy-MM-dd")}