我正在尝试读取注册表项,属性和值,并且能够调用该函数来创建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上。
答案 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)
}
}
希望这有帮助。