Отчетность по XML-узлам в PowerShell - PullRequest
0 голосов
/ 07 октября 2019

Я бы хотел перебрать набор XML и затем передать их переменным, которые могут быть напечатаны.

Вот пример данных:

<applications>
 <size>75</size>
 <application>
    <name>Applications 1</name>
    <path>/Applications/Utilities/Application 1</path>
    <version>10.14</version>
 </application>
 <application>
    <name>Application 2</name>
    <path>/Applications/Utilities/Application 2</path>
    <version>6.3.9</version>
 </application>
</applications>

IЯ пытался вывести ForEach-Object при попытке вывести его, но безрезультатно.

[string]$applicationProperties = $API.applications.application | ForEach-Object {
   $_.name
   $_.path
   $_.version
}

Это работает, но помещает их все в одну строку, я хотел бы, чтобы они печатались на отдельных строках, но яне удалось добавить префикс $_.

например, поэтому я хотел бы сохранить данные имени / пути / версии в переменных

[string]$applicationProperties = $API.applications.application | ForEach-Object {
   [string]$name_var = $_.name 
   [string]$path_var = $_.path
   [string]$version_var = $_.variable
}

Это дает мне одно "приложение",но не все возможные объекты. Также упоминается, что даже когда я нажимаю $name_var, он не обращается к этой переменной? Нужно ли что-то делать для доступа к этой переменной?


Создал это $applicationProperties = "Application Name $($applicationProperties[0].name)"

, но при вызове $applicationProperties я получаю Missing '=' operator after key in hash literal.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Используйте SelectNodes() с выражением XPath вместо точечного доступа, затем выведите имя и внутренний текст каждого выбранного узла:

$API.SelectNodes('//application/*') | ForEach-Object {
    '{0}={1}' -f $_.Name, $_.InnerText
} | Set-Content 'output.txt'
0 голосов
/ 07 октября 2019

Здесь попробуйте это.

[xml]$API = 
@"
<applications>
 <size>75</size>
 <application>
    <name>Applications 1</name>
    <path>/Applications/Utilities/Application 1</path>
    <version>10.14</version>
 </application>
 <application>
    <name>Application 2</name>
    <path>/Applications/Utilities/Application 2</path>
    <version>6.3.9</version>
 </application>
</applications>
"@

$applicationProperties = $API.applications.application | ForEach-Object {
@"
Name = $($_.name)
Path = $($_.path)
Version = $($_.version)
"@   
}

$applicationProperties | Out-File -FilePath C:\Output\appProps.txt

РЕДАКТИРОВАТЬ

[xml]$API = 
@"
<applications>
 <size>75</size>
 <application>
    <name>Applications 1</name>
    <path>/Applications/Utilities/Application 1</path>
    <version>10.14</version>
 </application>
 <application>
    <name>Application 2</name>
    <path>/Applications/Utilities/Application 2</path>
    <version>6.3.9</version>
 </application>
</applications>
"@

$applicationProperties = [System.Collections.ArrayList]@()

$API.applications.application | ForEach-Object {
    $myObj = [PSCustomObject]@{
        'Name'    = $_.Name
        'Path'    = $_.Path
        'Version' = $_.Version
    }
    #Adding objects to an array list prints the index each insert. Use null to suppress.
    $null = $applicationProperties.Add($myObj)
}

Чтобы получить доступ к переменным, введите $ applicationProperties в консоли и нажмите ввод. Он напечатает каждый объект в этом массиве. Для доступа к объекту по определенному индексу (массивы начинаются с 0) $ applicationProperties [0] для первого элемента $ applicationProperties [1] для второго и т. Д.

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