Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Powershell:为循环嵌套,从函数返回1个对象_Xml_Loops_Powershell_Foreach_Nested - Fatal编程技术网

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

Xml Powershell:为循环嵌套,从函数返回1个对象,xml,loops,powershell,foreach,nested,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 这给了我一

我试图读取注册表项、属性和值,并能够调用函数来创建xml文件,然后创建xml文件中的元素

我的注册表项看起来像:

HKCU\Software\TEX\library\... ...Key1 Prop1, Value1 Prop2, Value2 ...Key2 Prop1, Value1 Prop2, Value2 Prop3, Value3 ...Key3 Prop1, Value1 ...Key4...etc 这给了我一个对象和三个数组,每个属性一个。我可以这样展开每个对象的属性:

$obj = Get-RegValue -regPath $regPath

$obj.RegKey
$obj.RegProperty
$obj.RegValue
但是,要使this函数在创建xml文件的函数中工作,我认为我需要能够执行以下操作:

(Pseudo)
foreach($key in $obj.RegKey){
  $key.RegProperty 
  $key.RegValue
}
这不起作用,因为$obj.RegKey只允许返回RegKey对象

如果这是一个数据库,我需要在对象的属性之间创建一个关系。也许这就是我需要做的。但是怎么做呢?我是不是找错了方向,有更简单的方法来实现这一点

任何帮助都将受到感激

非常感谢

W.

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

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

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

是的,关键在于如何返回数据。与其自己创建和维护阵列,不如创建对象并将其放入输出,PowerShell将为您生成结果阵列

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

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)
    }
}

希望这能有所帮助。

很抱歉延迟回复。我没有收到通知我答案的电子邮件。非常感谢你,列夫根。工作是一种享受。我正在从创建快捷方式函数内部调用Get SubItem函数。一旦项目完全启动并运行,我会在我的博客上记录并在这里更新。如果能在博客上找到一个链接,看看它将如何工作,我会很感兴趣。祝项目顺利!瓦西里,谢谢你的回复。Levgen的解决方案对我很有效,但我对你的解决方案很感兴趣,我一定会尝试一下,并在这里反馈。再次感谢。
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)
    }
}