Вопрос или проблема
Я, должно быть, упускаю что-то очевидное, эта задача не должна быть такой сложной! Заранее спасибо, если вы сможете указать мне на это, не смеясь слишком сильно. Я пишу скрипт для обхода системы, который будет запускаться на каждом компьютере в моем домене при загрузке через 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
Объяснение изменений:
-
Создание одного объекта: Вместо использования хеш-таблицы и последующей обработки в цикле для преобразования в объект, мы сразу создаем объект [PSCustomObject], который содержит все нужные вам поля. Это позволяет сохранить сосредоточенность данных и упростить их вывод.
-
Использование 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, не стесняйтесь обращаться.