2016-07-11 6 views
1

Я написал сценарий, который строит пользовательский объект и экспортирует его в файл CSV:Powershell: Экспорт пользовательского объекта в 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>=...}?

ответ

1

выражение:

Select-Object {$_.LastWriteTime} 

выводит объект с одного свойства с именем $_.LastWriteTime. Самый простой способ исправить это использовать -ExpandProperty аргумент, который будет выводить только значение, которое вас интересует, например:.

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

Заметь, я также удалить блок сценария из команды Select-Object, как это не было необходимо.

0

В дополнение к zdan's helpful answer[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 } 

Эти два трубопровода на основе синтаксических форм медленнее, но имеют два преимущества:

  • Большие коллекции материалов лучше обрабатываются в трубопроводах один за другим, чтобы поддерживать постоянство памяти (если это возможно; если вам нужно собрать весь вывод в памяти, нет никаких преимуществ).

  • Этот синтаксис однозначно ссылается свойство отдельного элемента «s, а не свойство коллекции как целого.

    • Е.Г., (Get-ChildItem -File C:\Windows).Length возвращает количество файлов в C:\Windows, потому что Length интерпретируется как коллекции свойству объекта (массива);
      наоборот, Get-ChildItem -File C:\Windows | % Length возвращает массив значений отдельных файлов «.Length (размер файла).

[1] Для того, чтобы разработать немного: Select-Object [-Property] <string[]> возвращает пользовательский объект (экземпляр типа, производного от [pscustomobject] имени Selected.<originalFullTypeName>) для каждого объекта ввода, содержащий только указанные свойства ; даже с указанным единственным свойством, результатом являются пользовательские объекты с этим единственным свойством, а не сами значения свойств.
Напротив, использование -ExpandProperty <string> вместо [-Property] <string[]> возвращает заданное значение одного свойства из каждого входного объекта (набирается как-есть).

Смежные вопросы