PowerShell - ExpandProperty и правильный формат даты - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь использовать функцию -ExpandProperty в PowerShell, чтобы остановить появление заголовка в выводе и отформатировать дату без минут и секунд. Это просто чтобы получить дату создания объекта AD:

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

Это не приведет к результату, только если я исключу часть "-ExpandProperty", получится ли правильный формат даты, НО включает заголовок "Created", который мне не нужен.

Есть идеи, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

В 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

Расчетное свойство не имеет здесь смысла для ИМО, так как это единственный выход, так что это также должно сделать:

Get-ADComputer -Server $Server -Identity BlahBlah -Properties Created | 
  ForEach-Object {$_.Created.ToString("yyyy-MM-dd")}
0 голосов
/ 10 ноября 2018

К дополнению Полезный ответ LotPings , который предлагает эффективные решения:

Что касается , почему ваш код не работал :

В то время как Select-Object параметр -Property принимает хеш-таблицы , которые определяют вычисляемые свойства (например, в вашем коде), параметр -ExpandProperty принимает только свойство имя , как строка .

Следовательно, ваша хеш-таблица просто stringified , что приводит к строковому литералу System.Collections.Hashtable, в результате чего Select-Object выдает жалобу, учитывая, что у этого имени нет свойства.

Цель -ExpandProperty - вывести только свойство value , а не пользовательский объект с этим свойством .
Поэтому вам не нужен обходной путь через Select-Object, и вы можете просто использовать блок скрипта вывода значения - { $_.Created.ToString("yyyy-MM-dd") } - непосредственно с ForEach-Object вместо этого, как показано в нижней части ответа LotPings.


Однако есть скрытая функция, от которой вы отказываетесь, используя ForEach-Object: Select-Object позволяет объединять -ExpandProperty с -Property, и в этом случае добавляются свойства, указанные с помощью -Property как NoteProperty членов значения свойства, указанного через -ExpandProperty:

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

Обратите внимание, как для выходного значения string , 'uno' прикреплена копия свойства .two входного объекта.

Чтобы эмулировать это с ForEach, требуется больше работы:

PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } | ForEach-Object {
      $_.one + '!' | Add-Member -PassThru two $_.two
    }; $val; $val.two
uno!
2
0 голосов
/ 10 ноября 2018

У меня нет доступа к AD в данный момент, но это может быть то, что вы после

Обновлено

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