PowerShell Сбрасывает данные в XML-файл, затем читает их и конвертирует в исходный объект. - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю над проектом здесь, и я немного застрял в одном. Проект представляет собой автоматизацию процесса оценки для среды клиента.

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

Полученные данные должны быть организованы таким образом, чтобы я получал всю информацию и данные и добавлял их в PSCustomeObject / HashTable, а затем преобразовывал их в xml и сохранял по необходимому пути.

Для организации данных, которые я извлек в PSCustomObject / HashTable, у меня фактически есть вложенный PSCustomObject / HashTable, что делает его более сложным.

Данные, которые будут получены, имеют другой тип, некоторые из них на самом деле являются CSV-файлами, некоторые из них являются строками, а другие являются системными объектами.

Ниже приведен пример того, что я делаю с кодом.

#Get NSX Controller Config From Managing NSX Manager.
$ControllerConfig = $ContConfig

#Get NSx Controller VM vSphere Info.
$ControllerVmInfo = Get-VM -Server $vCenterServerHostingWorkingNsxControllers | Where-Object {$_.ExtensionData.moref.value -Eq $ContConfig.virtualMachineInfo.objectId}
$ControllerESXi = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-VMHost
$ControllerCluster = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Cluster
$ControllerDataStore = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Datastore
$ControllerSnapShot = Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Snapshot
$ControllerClusterResources = Get-ClusterInfo -ReqVIServer $vCenterServerHostingWorkingNsxControllers -ReqCluster $ControllerCluster.Name
$ControllerVMCpuUsagePercent = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat cpu.usage.average | Sort-Object Timestamp -Descending | Select-Object -First 1).Value
$ControllerVMMemUsagePercent = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat mem.usage.average | Sort-Object Timestamp -Descending | Select-Object -First 1).Value
$ControllerVMUsedDiskSpace = [math]::Round(((Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name).UsedSpaceGB | Measure-Object -Sum).sum)
$ControllerCpuHistoricUsage = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Stat cpu.usage.average)
$ControllerMemoryHistoricUsage = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Stat mem.usage.average)
$ControllerVMDiskReadLatency = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat virtualdisk.totalreadlatency.average)
$ControllerVMDiskWritLatency = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Realtime -Stat virtualdisk.totalwritelatency.average)
$ControllerVMMaxTotalLatency = (Get-VM -Server $vCenterServerHostingWorkingNsxControllers -Name $ControllerVmInfo.Name | Get-Stat -Stat disk.maxTotalLatency.latest)

#Get NSX Controller SSH Output.
$ControllerSSHPassword = ConvertTo-SecureString $EnvironmentInfo.NsxControllersPassword -AsPlainText -Force
$ControllerCredentials = New-Object System.Management.Automation.PSCredential ("admin", $ControllerSSHPassword)
$ControllerSSHSession = New-SSHSession -ComputerName $ContConfig.ipAddress -Credential $ControllerCredentials -AcceptKey
$ControllerClusterStatus = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show control-cluster status").Output
$ControllerClusterStartupNodes = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show control-cluster startup-nodes").Output
$ControllerDiskStatus = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show status").Output | Where-Object {$_ -Match "\S+\s+\d+\s+\d+\s+\d+\s+(\d+)%\s(\/\S*)$"}
$ControllerUpTime = (Invoke-SSHCommand -SSHSession $ControllerSSHSession -Command "show status").Output | Where-Object {$_ -Match "Uptime"}
Remove-SSHSession -SSHSession $ControllerSSHSession | Out-Null  

#Add all retrived data in a Hash Table
$NsxControllerDataRetrival = New-Object PSObject -Property @{
    ControllerId = $ControllerConfig.id
    ControllerConfig = $ControllerConfig
    ControllervSphereInfo = New-Object PSObject -Property @{
        ControllerVmInfo = $ControllerVmInfo
        ControllerESXi = $ControllerESXi
        ControllerCluster = $ControllerCluster
        ControllerDataStore = $ControllerDataStore
        ControllerSnapShot = $ControllerSnapShot
        ControllerClusterResources = $ControllerClusterResources
        ControllerVMCpuUsagePercent = $ControllerVMCpuUsagePercent
        ControllerVMMemUsagePercent = $ControllerVMMemUsagePercent
        ControllerVMUsedDiskSpace = $ControllerVMUsedDiskSpace
        ControllerCpuHistoricUsage = $ControllerCpuHistoricUsage
        ControllerMemoryHistoricUsage = $ControllerMemoryHistoricUsage
        ControllerVMDiskReadLatency = $ControllerVMDiskReadLatency
        ControllerVMDiskWritLatency = $ControllerVMDiskWritLatency
        ControllerVMMaxTotalLatency = $ControllerVMMaxTotalLatency
    }
    ControllerSshInfo = New-Object PSObject -Property @{
        ControllerClusterStatus = $ControllerClusterStatus
        ControllerClusterStartupNodes = $ControllerClusterStartupNodes
        ControllerDiskStatus = $ControllerDiskStatus
        ControllerUpTime = $ControllerUpTime
    }
}

 ($NsxControllerDataRetrival | ConvertTo-Xml).Save($ResultFilePath + "NSX-Controller-Data-" + $EnvironmentInfo.NsxManagerFqdn + ".xml")

На самом деле, если я использую PSObject и преобразую его в XML, он выдаст ошибку с приведенной ниже ошибкой, поскольку мне нужно будет добавить глубину, но трудно определить требуемую глубину, учитывая, что вышеупомянутое повторяется многократно через процесс с различными данными, которые будут получены в разное время.

ConvertTo-Xml : Unexpected end of file has occurred. The following elements are not closed: Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Object, 
Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Property, Object, Property, Property, Property, Property, Property, Property, Property, Property, 
Property, Property, Property, Property, Property, Property, Property, Object, Objects. Line 6, position 10817.
At \\tsclient\RDP-Shared-Folder\New-Multi-Site-Tool\Sub-Scripts\CGS-AT-Gather-NSX.ps1:1065 char:29
+                         ($NsxControllerDataRetrival | ConvertTo-Xml).Save($Re ...
+                                                       ~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertTo-Xml], XmlException
    + FullyQualifiedErrorId : System.Xml.XmlException,Microsoft.PowerShell.Commands.ConvertToXmlCommand

Если использовать HashTable, чтобы добавить все данные и затем вывести их в файл XML, формат файла XML будет очень сложным, и я не смог выяснить точечную запись или запрос XPath для извлечения атрибутов / элементов при чтении XML-файл в более поздней точке. Пример файла XML выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Object Type="System.Collections.Hashtable">
    <Property Name="Key" Type="System.String">ControllerSshInfo</Property>
    <Property Name="Value" Type="System.Collections.Hashtable">
      <Property Name="Key" Type="System.String">ControllerClusterStatus</Property>
      <Property Name="Key" Type="System.String">ControllerUpTime</Property>
      <Property Name="Value" Type="System.String">Uptime: 106 days 16 hours 43 minutes 54 seconds </Property>
      <Property Name="Key" Type="System.String">ControllerClusterStartupNodes</Property>
      <Property Name="Value" Type="System.String[]">
        <Property Type="System.String">192.168.4.61, 192.168.4.62, 192.168.4.63</Property>
      </Property>
      <Property Name="Key" Type="System.String">ControllerDiskStatus</Property>
      <Property Name="Value" Type="System.Object[]">
        <Property Type="System.String">devtmpfs         2009560       0   2009560   0% /dev</Property>
        <Property Type="System.String">/dev/sda2        3997376 2266940   1504340  61% /</Property>
        <Property Type="System.String">/dev/sda1         999320   40952    889556   5% /boot</Property>
        <Property Type="System.String">/dev/sda6        1998672    3092   1874340   1% /config</Property>
        <Property Type="System.String">/dev/sda3        3997376    8184   3763096   1% /os_bak</Property>
        <Property Type="System.String">/dev/sda5        5029504 1795892   2955084  38% /var/log</Property>
        <Property Type="System.String">/dev/sda7        5029504   10236   4740740   1% /image</Property>
        <Property Type="System.String">/dev/sda4        3997376  142004   3629276   4% /var/cloudnet/data</Property>
      </Property>
    </Property>

Буду признателен за помощь, если вы поможете мне с выгрузкой данных в XML-файл с более простым форматированием или даже укажете мне другой путь, по которому я могу сделать выше.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы пробовали Export-CliXml и Import-CliXml? Это сделано для сохранения объектов PS как XML и обратно.

https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Export-Clixml?view=powershell-5.1

Это позволит получить dirinfo объектов, экспортировать и импортировать их и выгрузить первый.

Export-Clixml -InputObject $x -path c:\temp\test.xml
$listing = Import-Clixml -Path c:\temp\test.xml
$listing[0] | gm

выход

TypeName: Deserialized.System.IO.DirectoryInfo
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...