Powershell:嵌套For循环,从函数返回1个对象

时间:2014-01-07 02:06:42

标签: xml loops powershell foreach nested

我正在尝试读取注册表项,属性和值,并且能够调用该函数来创建xml文件,然后创建XML文件中的元素。

我的注册表项看起来像:

HKCU\Software\TEX\library\...
...Key1
      Prop1, Value1
      Prop2, Value2
...Key2
      Prop1, Value1
      Prop2, Value2
      Prop3, Value3
...Key3
      Prop1, Value1
...Key4...etc

每个键包含一个或多个属性及其各自的值。

key(n)表示xml文件名(key1.xml,key2.xml,key3.xml等...) 属性和值表示xml文件中的元素。

在函数内部调用函数,该函数使用其元素创建xml文件。到目前为止,我有它创建3个文件,但我最终得到的每个文件包含所有键的所有属性和值。我需要为每个xml文件找出一种方法,只包含其各自的属性和值。我相信诀窍在于此函数如何返回其数据。我正在努力让它返回一个包含来自两个循环的累积数据的对象。在对另一个论坛成员的问题here提出建议后,我提出了以下建议:

function Get-RegValue ([string]$regPath){

       $regProp = (Get-ChildItem $regPath) 
       $scNameArray = @()
       $scRegValueArray = @()
       $scRegPropArray = @()
# Key loop
       foreach ($subKey in $regProp){
           $subKeyPath = $subKey.PSPath
           $prop = $subKey.Property
           $scName = $subkey.PSChildName
           $scNameArray += $scName
# Property & value loop           
          foreach($value in $prop){ # | Select-Object $scIndex.ToString() -Unique 
                $regValue = (Get-ItemProperty $subKeyPath).$value
                $scRegValueArray += $value
                $scRegPropArray += $regValue
           }
       }

 New-Object PSObject -Property @{
                        RegKey=$scNameArray
                        RegValue=$scRegPropArray
                        RegProperty=$scRegValueArray
                }
 } 

这给了我一个带有三个数组的对象,每个属性一个。我可以像这样“扩展”每个对象的属性:

$obj = Get-RegValue -regPath $regPath

$obj.RegKey
$obj.RegProperty
$obj.RegValue

但是,为了使这个函数在创建xml文件的函数内部工作,我想我需要能够做到这样的事情:

(Pseudo)
foreach($key in $obj.RegKey){
  $key.RegProperty 
  $key.RegValue
}

这不起作用,因为$ obj.RegKey只允许返回“RegKey”对象。

如果这是一个数据库,我需要在对象的属性之间创建一个“关系”。也许这就是我需要做的。但是怎么样?我是在咆哮完全错误的树,还有一种更容易实现的方法吗?

感谢任何帮助。

非常感谢

W上。

2 个答案:

答案 0 :(得分:0)

您可以使用foreach循环而不是for循环,从而通过使用数组索引在项目之间创建元关系:

for ($i = 0; $i -lt ($obj.regkey).count; $i++) {
    $obj.RegKey[$i]
    $obj.RegValue[$i]
    $obj.RegProperty[$i]
}

答案 1 :(得分:0)

看起来您的问题出在Get-RegValue函数中。它返回一个键,属性名称和值的数组,而没有键和属性之间的关联。

是的,诀窍在于如何返回数据。您应该只创建对象并将它们放到输出中,而不是自己创建和维护数组,PowerShell将为您生成结果数组(http://technet.microsoft.com/en-us/library/hh847760.aspx)。

您可以使用以下代码创建一个包含文件名(键)并与其关联的对象数组(哈希表):

Function Get-SubItem([string]$RegistryPath)
{
    Get-ChildItem -Path $RegistryPath | % {
        $key = @{}
        $key.FileName = $_.PSChildName
        $key.Property = @{}
        foreach ($name in $_.Property) 
        {
            $key.Property.Add($name, $_.GetValue($name))
        };
        $key
    }
}

Get-SubItem -RegistryPath "HKCU:\Test" | % {
    Write-Host $_.FileName
    foreach ($entry in $_.Property.GetEnumerator()) 
    {
        Write-Host ("`t{0} - {1}" -f $entry.Key, $entry.Value)
    }
}

希望这有帮助。

相关问题