3

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

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

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

请问有什么想法吗?

4

3 回答 3

1

为了补充 LotPings 的有用答案,它提供了有效的解决方案:

至于为什么您的代码不起作用

虽然Select-Object's-Property参数接受定义计算属性的哈希表(例如在您的代码中),但该参数仅接受属性name,作为string-ExpandProperty

因此,您的哈希表只是stringified,导致 string literal System.Collections.Hashtable,导致Select-Object抱怨,因为没有该名称的属性。

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


但是,您可以通过使用ForEach-Object:放弃一个晦涩的功能,Select-Object允许与结合 ,在这种情况下,通过指定的属性作为成员添加到通过指定的属性的中:-ExpandProperty-Property-PropertyNoteProperty-ExpandProperty

PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } |
      Select-Object -ExpandProperty one -Property two; $val; $val.two
uno
2

请注意输出字符串值如何附加'uno'输入对象属性的副本。.two

要模拟它ForEach需要更多的工作:

PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } | ForEach-Object {
      $_.one + '!' | Add-Member -PassThru two $_.two
    }; $val; $val.two
uno!
2
于 2018-11-10T13:34:38.047 回答
1

我目前无权访问广告,但这可能是您所追求的

更新

Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created | Select-Object Created | ForEach-Object {$_.Created.ToString("yyyy-MM-dd")}
于 2018-11-10T11:39:26.420 回答
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")}
于 2018-11-10T11:47:26.307 回答