Сам CSV подразумевает что это текстовый файл или просто тип записи, где значения разделены запятыми. При этом не всегда значение разделяются запятыми, это могут быть и двоеточия, или точки запятыми и т.д. Сам выгруженный CSV файл выглядит так:
Для того, что бы узнать какие командлеты есть для работы с csv в Powershell нужно выполнить команду:
Export-CSV тот командлет, который выгрузит все в нужный для нас формат. Для этого получим любые данные с Powershell. Я хочу получить список запущенных процессов:
Для того что бы экспортировать данные мы должны использовать pipeline (конвейер), т.е. | , который к каждому объекту Get-Proccess применит Export-CSV:
По умолчанию данные экспортируются с разделителем в виде запятой. Сам разделитель называется делиметром и если мы планируем открывать файл в какой-то программе, например экспортируем для Excel, может потребоваться другой делимитер. Например Excel берет делимитер из региональных настроек:
Или мы можем узнать его с помощью командлета:
Изменять системный делимитер я бы не советовал, а вот экспортировать данные в нужном формате можно так:
Если мы будем запускать такой экспорт на многих удаленных компьютерах, то можно подставить делимитер у каждого свой. Просто объявим переменную:
Или аналогичный командлет для примера:
Если мы добавим ключ -NoTypeInformation у нас не будет добавляться строчка с информацией типа TYPE:
Теперь импортируем этот же файл в Powershell. Мы так же можем указать нужный делимитер или использовать ключ -UseCulture:
Формат вывода csv в powershell, по умолчанию, в виде листа. Для того что бы сделать вывод в формате таблицы добавим pipeline и команду Format-Table (алиас ft ). Пример:
Теперь рассмотрим вариант, который я буду применять в работе. Я хочу следить за динамикой роста занятого места на диске что бы вовремя его расширить или принять меры что бы освободить место. Для того что бы получить такие данные я использую:
Где:
—Filter «Device » — фильтруем данные по букве диска. В моем случае это системный диск.
Меня интересует только буква диска, занятое место, и сколько всего места. Добавляем конвейер с выбором нужных колонок:
Меня не интересуют значения в гигабайтах. Вычисляю эти значения:
При этом я должен знать дату, когда значения получены:
Объявляем все это в переменные:
Добавляю дату к колонкам информации о дисках:
Проверяю что переменная выводит то, что нужно:
И заношу все это в файл:
Где ключ:
-InputObject — мы можем использовать этот ключ или конвейер для передачи объектов
-Append — говорит о том, что мы не перезаписываем файл, а добавляем в него новые значения. При этом если он не был создан, то он создастся.
Среди дополнительных ключей, которые я не использовал, есть:
-Encoding — который дает возможность кодировку для импорта и экспорта. По умолчанию используется UTF8NoBOM.
-Force — перезапишет файл, который был только для чтения.
-NoClobber — не перезапишет файл, если он уже существует
-Header — добавит заголовок там, где он отсутствует.
У нас осталось еще два похожих командлета. Они, в отличие от предыдущих, не записывают данные в файл, а выводят на экран. Для того что бы преобразовать в формат CSV:
Для того что бы выполнить обратное преобразование:
Остальные варианты выполнения этих комманд можно получить через справку:
I want to export Write-Host «$computer$DESTINATION» to the CSV files so I know which computers were offline when the script ran.
I am running this from a Windows 7 machine
4 Answers 4
This solution creates a psobject and adds each object to an array, it then creates the csv by piping the contents of the array through Export-CSV.
If you pipe a string object to a csv you will get its length written to the csv, this is because these are properties of the string, See here for more information.
This is why I create a new object first.
Try the following:
This will give you:
If you use the Get-Member on Write-Output as follows:
You will see that it has one property — ‘length’:
This is why Length will be written to the csv file.
Update: Appending a CSV Not the most efficient way if the file gets large.
Get-Service -Name «wuauserv» -ComputerName «server1», «server2», «server3» | FT -Property MachineName, Status, Name | Export-Csv -Path C: mpwuausrv_status.csv -Delimiter «;» -Encoding Unicode
- Вопрос задан более года назад
- 819 просмотров
используйте ключ -NoTypeInformation
Get-Service -Name «wuauserv» -ComputerName «server1», «server2», «server3» | FT -Property MachineName, Status, Name | Export-Csv -Path C: mpwuausrv_status.csv -Delimiter «;» -Encoding Unicode -NoTypeInformation
хорошо. вместо ФТ в команде поставьте select.
Источник: