Для работы с Excel в среде powershell нужно использовать COM объект.
#Создаем новый объект
$excel = New-Object -ComObject Excel.Application
При выполнении данного командлета произойдет запуск приложения Excel в скрытом состоянии, т.е. у нас будет висеть процесс Excel, но при этом самого приложения как такового мы не увидем. Для того чтобы увидеть работу приложения нужно обратиться к его свойству Visible и установить его в TRUE т.к. по умолчанию стоит FALSE
#Режим записи видимый
$excel.Visible = $true
Далее после того как приложение открылось нужно создать книгу воспользовавшись свойством Workbooks и методом Add().
#Создаем книгу Excel
$EWB = $excel.Workbooks.Add()
После создания книги нужно выбрать лист с которым будем работать в данной книге. Для этого воспользуемся свойством Worksheet и методом Item()передав ему номер листа с которым будем работать.
#Выбираем первый лист книги
$EWS = $EWB.Worksheets.Item(1)
Зададим имя нашему листу для этого используем свойство Name и присвоим ему значение нового имени листа.
#Название листа книги
$EWS.Name = 'Service'
Так как Excel это таблица и мы работаем с ее ячейками то используем свойство Cells и метод Item() для указания с какими ячейками данного листа мы будем работать. Отсчет начинается с 1.
#Первая строка ячеек
$EWS.Cells.Item(1,1) = 'Status'
$EWS.Cells.Item(1,2) = 'Name'
$EWS.Cells.Item(1,3) = 'DisplayName'
В данном примере мы устанавливаем названия наших колонок которые в дальнейшем будем заполнять. Первый аргумент это номер строки с которой работаем, второй аргумент это ячейка в таблице. Перед тем как перебирать массив с данными и записывать все в таблицу нам нужна вспомогательная переменная которая будет ссылаться на начальную строку в таблице с дальнейшим увеличением в цикле для перехода на новую строку.
#Перебераем массив и вставляем в нужные ячейки листа
$j = 2
foreach($arr in $srv)
{
#Если процесс запущен то зеленый иначе красный
if($arr.Status -eq 4){
$EWS.Cells.Item($j,1) = 'Запущен'
$color = 10
}else{
$EWS.Cells.Item($j,1) = 'Остановлен'
$color = 3
}
$EWS.Cells.Item($j,2) = $arr.Name
$EWS.Cells.Item($j,3) = $arr.DisplayName
$EWS.Cells.Item($j,1).Font.Bold = $true
$EWS.Cells.Item($j,1).Font.ColorIndex = $color
$j++
}
После того как книга заполнена нужными данными ее необходимо сохранить. Для этого используем метод Saveas() и передаем ему путь и имя файла для сохранения.
#Сохраняем книгу
$EWB.Saveas('C:\Excel\services.xlsx')
После этого закрываем саму книгу воспользовавшить методом Close().
#Закрываем книгу
$EWB.Close()
После того как закрыли книгу можно завершать работу приложения Excel использую метод Quit(). Тем самым освободив память в системе.
#Закрываем приложение Excel
$excel.Quit()
У данного способа есть существенный недостаток это очень медленная работа экспорта данных в таблицу Excel, но за то можно создавать красивые отформатированные таблицы для конечного пользователя. Здесь представлен полный скрипт, который получает список всех служб на вашем компьютере и записывает их в ячейки таблицы Excel.
#Получаем список всех процессов
$srv = Get-Service
#Создаем новый объект
$excel = New-Object -ComObject Excel.Application
#Режим записи видимый
$excel.Visible = $true
#Создаем книгу Excel
$EWB = $excel.Workbooks.Add()
#Выбираем первый лист книги
$EWS = $EWB.Worksheets.Item(1)
#Название листа книги
$EWS.Name = 'Service'
#Первая строка ячеек
$EWS.Cells.Item(1,1) = 'Status'
$EWS.Cells.Item(1,2) = 'Name'
$EWS.Cells.Item(1,3) = 'DisplayName'
#Перебераем массив и вставляем в нужные ячейки листа
$j = 2
foreach($arr in $srv)
{
#Если процесс запущен то зеленый иначе красный
if($arr.Status -eq 4){
$EWS.Cells.Item($j,1) = 'Запущен'
$color = 10
}else{
$EWS.Cells.Item($j,1) = 'Остановлен'
$color = 3
}
$EWS.Cells.Item($j,2) = $arr.Name
$EWS.Cells.Item($j,3) = $arr.DisplayName
$EWS.Cells.Item($j,1).Font.Bold = $true
$EWS.Cells.Item($j,1).Font.ColorIndex = $color
$j++
}
#Сохраняем книгу
$EWB.Saveas('C:\Excel\services.xlsx')
#Закрываем книгу
$EWB.Close()
#Закрываем приложение Excel
$excel.Quit()