2014-10-01 65 views
0

背景:我以JSON格式获取数据,并且必须与Set-QADUser(来自Quest ActiveRoles Management Shell)一起使用它来更新Active Directory中的用户。将对象转换为PowerShell中的关联数组

只需提供解析从JSON到cmdlet结果在该错误消息中的数据:

无法索引类型System.Collections.Generic.Dictionary`2 + ValueCollection的目的[[System.String ,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Object,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]。

我可以遍历这样的对象:

PS C:\scripts> $data.params | ForEach-Object { $_ } 

Key    Value 
---    ----- 
manager   CN=smith,OU=Employees,OU=People,OU=Department,OU=... 
department  Department 
company   Company 
homeDirectory  \\\\win7x64gerald.testdomain.com\\jdoe 
homeDrive   U: 
primaryGroupID 1501 
userPrincipalName [email protected] 

但SET-QADUser期望数据是在关联数组格式(或哈希表)。从帮助示例:

C:\PS>Set-QADUser 'mycompany.com/usersOU/User1' -objectAttributes @{[email protected]('555-34-67','555-34-68')} 

我希望能够只是遍历它上面的和访问键和值的参数是这样的:

PS C:\scripts> $data.params | ForEach-Object { $_.Key } 

但这恰恰说明不了什么。

$data.params.keys显示所有的键,与值相同,但我不能通过追加[0]来获取特定的键,并且没有我能找到的get-method。

那么,如何将这样的对象转换为关联数组呢?

回答

0

我发现:

# Create empty hashtable 
$params = @{} 
# iterate over every key and add it to the hashtable 
$data.params.keys | foreach { $params[$_] = $data.params[$_] } 
+0

您在代码中的评论可能会引起误解。你正在创建一个空的HashTable,我相信这是你的目的,所以很好。通常引用的'数组'是'$ params = @()'来创建一个空数组。 – TheMadTechnician 2014-10-01 18:14:39

+0

你说得对,这就是任务工具的文档所称的。我编辑了问题和答案,以更好地反映术语。 – 2014-10-01 19:51:05

1

也许就像使用convertfrom-json一样简单?

+0

它不回答这个问题。仅仅包括一个小例子可能会更好。它对大多数人而言都很直观,但并非全部。 – Matt 2015-01-03 12:57:21