Вывод информации из скрипта PowerShell: преобразование из столбцов в строки в csv.

Вопрос или проблема

Я, должно быть, упускаю что-то очевидное, эта задача не должна быть такой сложной! Заранее спасибо, если вы сможете указать мне на это, не смеясь слишком сильно. Я пишу скрипт для обхода системы, который будет запускаться на каждом компьютере в моем домене при загрузке через GPO. Каждый раз, когда он запускается, он должен добавлять строку со всей собранной информацией в файл CSV на общем диске. Я могу получить вывод только в виде столбцов.

Код:

$loglocation = "C:\Temp"
$timestamp = Get-Date -UFormat "%Y-%m-%d %H:%M"
$ipaddress = Get-NetIPAddress | fl -Property ipaddress | Out-String -stream | 
Select-String 10.15

# Добавить информацию в хэш-таблицу
$computerinfohastable = [ordered]@{
Timestamp = $timestamp
Hostname = hostname
OSName = (Get-WmiObject Win32_OperatingSystem).Caption
OSVer = (Get-WmiObject Win32_OperatingSystem).Version
IPAddress = ($ipaddress -replace "ipaddress : ").Trim()
    }

# Преобразовать в объект
$computerinforows = $computerinfohastable.Keys | ForEach-Object {
[PSCustomObject]@{
    Property = $_
    Value = $computerinfohastable[$_]
}
}

# Вывести в csv
$computerinforows | Export-Csv -Path "$loglocation\testfile.csv" -
NoTypeInformation -Append

Что я получаю:

Property    Value 
Timestamp   11/25/2024 14:23 
Hostname    ##### 
OSName      Microsoft Windows 11 Enterprise 
OSVer       10.0.26100 
IPAddress   nnn.nnn.nnn.nnn

Что я хочу:

Timestamp          Hostname  OSName                             OSVer          IPAddress 
11/25/2024 14:23   #####     Microsoft Windows 11 Enterprise    10.0.26100     nnn.nnn.nnn.nnn

Я искал информацию в интернете и пробовал несколько методов для транспонирования, но без успеха. Буду признателен за любые советы.

Ответ или решение

Чтобы решить проблему преобразования данных в нужный вам формат для CSV файла, давайте внимательно разберём ваш код и внесём необходимые изменения. Ваше текущее решение создает объект с двумя свойствами: Property и Value, что приводит к выводимым столбцам. Вместо этого, нам необходимо организовать данные в виде строки, представляющей информацию о системе, чтобы при экспорте в CSV они располагались в одном ряду.

Ваша задача

Вы хотите, чтобы следующий вывод:

Property    Value 
Timestamp   11/25/2024 14:23 
Hostname    ##### 
OSName      Microsoft Windows 11 Enterprise 
OSVer       10.0.26100 
IPAddress   nnn.nnn.nnn.nnn

был преобразован в:

Timestamp          Hostname  OSName                             OSVer          IPAddress 
11/25/2024 14:23   #####     Microsoft Windows 11 Enterprise    10.0.26100     nnn.nnn.nnn.nnn

Решение

Для достижения желаемого формата будем использовать [PSCustomObject], который будет представлять информацию о системе в виде одной записи. Ниже приведен исправленный код:

$loglocation = "C:\Temp"
$timestamp = Get-Date -UFormat "%Y-%m-%d %H:%M"
$ipaddress = Get-NetIPAddress | fl -Property ipaddress | Out-String -stream | Select-String 10.15

# Создание объекта с необходимыми данными
$computerinfoobject = [PSCustomObject]@{
    Timestamp = $timestamp
    Hostname = hostname
    OSName = (Get-WmiObject Win32_OperatingSystem).Caption
    OSVer = (Get-WmiObject Win32_OperatingSystem).Version
    IPAddress = ($ipaddress -replace "ipaddress : ", "").Trim()
}

# Вывод в CSV
$computerinfoobject | Export-Csv -Path "$loglocation\testfile.csv" -NoTypeInformation -Append

Объяснение изменений:

  1. Создание одного объекта: Вместо использования хеш-таблицы и последующей обработки в цикле для преобразования в объект, мы сразу создаем объект [PSCustomObject], который содержит все нужные вам поля. Это позволяет сохранить сосредоточенность данных и упростить их вывод.

  2. Использование Export-Csv: При передаче объекта в Export-Csv, каждая запись представляет собой строку. Это означает, что каждая строка в CSV файле будет содержать значения всех указанных в объекте свойств.

Результат

После внесения указанных изменений ваш вывод в CSV будет выглядеть так, как вы желаете, с каждым элементом данных непосредственно в одной строке, представляющей все свойства:

Timestamp,Hostname,OSName,OSVer,IPAddress
11/25/2024 14:23,#####,"Microsoft Windows 11 Enterprise",10.0.26100,nnn.nnn.nnn.nnn

Такой подход обеспечит полноценный экспорт данных в понятном и удобочитаемом формате, который будет легко обрабатывать в дальнейшем.

Если у вас есть дополнительные вопросы или требуются пояснения по другим аспектам PowerShell, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...