【问题标题】:Reporting on XML nodes in PowerShell在 PowerShell 中报告 XML 节点
【发布时间】:2020-02-04 21:22:43
【问题描述】:

我想要遍历一组 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>

我曾在尝试输出时使用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.

【问题讨论】:

  • [string]$applicationProperties -> [string[]]$applicationProperties
  • 我个人会避免在 PowerShell 脚本中严格输入,除非有充分的理由强制执行类型。
  • @AnsgarWiechers 很高兴知道,您有推荐的解决方案吗?
  • 我以为我刚刚做到了。
  • @AnsgarWiechers 所以一旦我做出了改变,我将如何访问这些变量?我是 PowerShell 新手,很抱歉这些问题。

标签: xml powershell api foreach


【解决方案1】:

使用SelectNodes()XPath 表达式代替点访问,然后输出每个选定节点的名称和内部文本:

$API.SelectNodes('//application/*') | ForEach-Object {
    '{0}={1}' -f $_.Name, $_.InnerText
} | Set-Content 'output.txt'

【讨论】:

  • 谢谢,如何将其设置为变量?当我尝试使用它时,我得到了 = hash literal errors 我已经将它导出到 output.txt 文件了。
  • “将其设置为变量”是什么意思?你想在变量中做什么,你想用这些变量做什么?
  • 我想将它们输出到我正在导出的文件中。我还导出了数百个字段,因此拥有另一个文件不会完成这项工作 - 因此为什么将数据放在变量中会使导出它们更容易。 *编辑,但这只是我的 2 美分,你知道得更好,所以我会接受你的建议。
  • 什么字段到什么文件?我们无法为您提供帮助,除非您更具体地了解您拥有哪些数据,以及您想用这些数据做什么。
  • 其他字段无关紧要,我只想拥有它,所以每个字段都有Name = $name
【解决方案2】:

来试试这个。

[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 并按 Enter。它将打印该数组中的每个对象。访问特定索引处的对象(数组从 0 开始) $applicationProperties[0] 用于第一项 $applicationProperties[1] 用于第二项,依此类推。

【讨论】:

  • 那太好了,但是我还有很多其他属性和字段,我也包括在内,有没有办法通过执行 ForEach-Object 并将它们导出到变量来做到这一点可以用吗?
  • @andyarnold 你能给我完整的示例数据吗?
  • 实际数据源海量。但是我在上面第一个 XML sn-p 中链接的是一小部分数据,我只是忙于将其导出到变量中,这可能吗?
  • 酷。因此,如果我希望 Name 成为一个变量,我会这样做:$nameVar = $applicationProperties[0]?
  • @andyarnold $nameVar = $applicationProperties[0].Name yessir!
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多