Не могу понять, как изменить значение узла XML, генерируемое скриптом PowerShell - PullRequest
1 голос
/ 15 апреля 2020

Я несколько лет баловался с PowerShell, но никогда не имел дело с XML, и мне трудно найти решение проблемы, с которой я сталкиваюсь. Я читал через бесчисленные темы на различных форумах, и я думаю, что по общему признанию я просто недостаточно понимаю о том, что я пытаюсь сделать sh, или что другие люди объясняют в других темах.

Я работаю над сценарием PowerShell, написанным кем-то другим, который в основном собирает данные таблиц и экспортирует их в файл XML. Экспортируемые данные таблицы можно использовать в их текущем состоянии, но для некоторых значений, которые НЕ получены из таблиц, мне нужно найти простой способ изменения имени узла XML.

My Пример сценария PS выглядит так:

$StartDate = [Management.ManagementDateTimeConverter]::ToDateTime($SYSINFO.LastBootUpTime)
$StartDate = "{0:G}" -F $StartDate
$EndDate = "{0:G}" -F (Get-Date)
$UPTIME = New-TimeSpan -Start $StartDate -End $EndDate
# Format Uptime for "DD:HH:MM:SS.MMMM"
$DispTime = "{0:G}" -F $UPTIME
# Remove .MMMM (Milliseconds)
$DispTime = $DispTime.Split('.')[0]
$DispTime = "$DispTime"

$DispTime | ConvertTo-XML -As String | Out-File -LiteralPath (C:\Scripts\ + "Uptime_Status.xml")

Мой XML вывод в конечном итоге выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Objects>
  <Object Type="System.String">0:06:56:39</Object>
</Objects>

Мне нужно изменить тег <Object Type="System.String"> на что-то еще, например <UPTIME>0:06:56:39</UPTIME>, или, возможно, даже <Object Type="System.String" Name="Uptime">0:06:56:39</Object>

Цель состоит в том, чтобы отличить имя узла от других тегов XML, которые будут похожи на это, когда я использую не-таблицу данные. Я также вижу возможность необходимости повторять это, поэтому мне было интересно, может ли быть опция, просто использующая значение переменной PS в качестве имени узла XML во всем файле XML, автоматически. Так, например, если я работаю с 20 фрагментами данных и, возможно, я помечаю данные одного из значений, которые должны быть записаны в XML, как $DispTime, возможно, у меня также может быть другая переменная, такая как $DispTime_NodeName = "Uptime", и тогда результирующее XML может быть просто: <Uptime>0:06:56:39</Uptime>. Таким образом, в основном сценарий PS должен был бы найти соответствующее имя переменной, которое включает в себя «_NodeName», а затем использовать значение THAT в качестве XML имени узла. Я сумасшедший? Это невозможно? Я слишком обдумываю это?

Большое спасибо всем, кто готов помочь .... Я был бы очень признателен за любую solid помощь, которую я могу получить. Просто имейте в виду, я все еще очень начинающий в этом :) Ха-ха

1 Ответ

1 голос
/ 15 апреля 2020

Для простого примера в вашем вопросе вы можете создать свой собственный XML документ с нуля:

$xmlDoc = [xml]::new()

# Add declaration
[void]$xmlDoc.AppendChild($xmlDoc.CreateXmlDeclaration('1.0', 'utf-8', $null))

# Add <root> node to document
$root = $xmlDoc.AppendChild($xmlDoc.CreateElement('root'))

# Add <uptime> node to <root>
$uptime = $root.AppendChild($xmlDoc.CreateElement('uptime'))

# Set inner text value on <uptime> node
$uptime.InnerText = $DispTime

# Save document
$xmlDoc.Save((Join-Path C:\Scripts "Uptime_Status.xml"))

Если вы хотите более удобный способ создания XML документов, то Xml модуль отключен из PowerShell Gallery, может помочь:

Установить с помощью:

Install-Module Xml

Тогда:

Import-Module Xml

$doc = New-XDocument root -Version 1.0 -Encoding utf-8 {
    New-XElement uptime {
      $DispTime
    }
}

$doc.Save((Join-Path C:\Scripts "Uptime_Status.xml"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...