【问题标题】:How to append/update multidepth object in Powershell?如何在 Powershell 中追加/更新多深度对象?
【发布时间】:2017-09-04 09:23:21
【问题描述】:

我无法理解如何在对象中追加或更新数据

所以假设我有一个带有数据的对象,在运行此命令后,我想添加到模式中的对象的模式如下所示

$testdata | Format-Custom -Property * -Depth 6
PSCustomObject 类 { 会话 = [ PSCustomObject 类 { 类型 = 当前 生成 = 2017-08-31T09:02:55.251Z 窗户= [ PSCustomObject 类 { 编号 = 770 隐身=假 标签 = [ PSCustomObject 类 { 活跃=真 编号 = 771 隐身=假 标题 = 订阅 - YouTube 网址 = https://www.youtube.com/feed/subscriptions 窗口 ID = 770 } PSCustomObject 类 { 活跃 = 假 编号 = 776 隐身=假 标题 = 过度讽刺的作品 - YouTube 网址 = https://www.youtube.com/user/RedEyesTakeWarning/videos 窗口 ID = 770 } ] } PSCustomObject 类 { 编号 = 773 隐身=假 标签 = [ PSCustomObject 类 { 活跃 = 假 编号 = 774 隐身=假 标题 = 技术 - Google 新闻 网址 = https://news.google.com/news/headlines/section/topic/TECHNOLOGY?ned=us&hl=en 窗口 ID = 773 } PSCustomObject 类 { 活跃 = 假 编号 = 806 隐身=假 title = Microsoft PowerShell 是黑客的热门目标,但其防御能力正在改善 |有线 网址 = https://www.wired.com/story/microsoft-powershell-security/ 窗口 ID = 773 } ... ] } ] } ] }

假设我想在 windows 中添加一个 ID 为 770 的新选项卡 新标签的 title 将是 yahoourl 将是 https://yahoo.comid 将是 9001

如何将新条目添加到选项卡中而无需重新创建整个对象?

【问题讨论】:

  • 请退后一步,描述您要解决的实际问题,而不是您认为的解决方案。
  • 好吧,通常当你追加say...比如数组或哈希时,你使用+=$hash.add(something, $something),我不明白你将如何在特定对象中添加数据对象。 ..因为我不能只去($testdata.sessions.windows.Where({$_.id -eq 770}).tabs) += $newtabobject,因为当我尝试它时它似乎不起作用,尽管它与其他选项卡对象的设置相同
  • 你是如何创建$testdata 对象的?
  • 它只是一个 json 文件的导入 ...$testdata = Get-content $file | Convertfrom-json ... 是我在这里运行的...。我不创建方案,也不想...它需要保持原样

标签: powershell object append updating


【解决方案1】:

所以这并不是真正的答案,而更像是一种解决方法。

我自己不明白如何在 Powershell 中修改你想要的对象。通常一个简单的+= 通常适用于大多数事情。

但是,对于您的问题,这似乎是试图在具有特定 ID 的特定对象中添加具有键值对的对象 += 是行不通的,因为您正在尝试解析它。你只会得到一个愚蠢的Property not being found之类的错误。

我这样做的方式是,如果它是一个静态列表,并且在我更新它之前订单/位置不会改变,那么我会获取我希望添加到的特定对象的 INDEX。然后根据索引对您希望修改的任何对象执行简单的+= 数据对象/哈希。

如下:

首先,使用键值对准备新对象或哈希。

 $newhash = @{}
 $newhash.Add("title","yahoo") 
 $newhash.Add("url", "https://yahoo.com")
 $newhash.Add("id", "9001")

接下来,使用.IndexOf() 找到您要修改/添加到的对象的索引,例如您的 id 770

$position = $testdata.sessions.windows.id.IndexOf(770)

这应该告诉您具有 770 特定 id 的对象在对象列表中的位置

现在,从字面上看,对要添加/修改的特定窗口的选项卡执行简单的+=

$testdata.sessions.windows[$position].tabs += $newhash

如果您感到困惑,请在某事后使用 [] 表示选择其在列表中的位置,例如 [0] 是第一个等等。

应该是这样的。

注意:这不适用于在更新数据之前更新数据以及在修改数据之前更改位置的情况。

我知道这可能不是您想要的,但仍然是。

希望这会有所帮助。

【讨论】:

  • 非常感谢。你是对的,这不是我正在寻找的具体内容,但它确实有帮助。所以从某种意义上说,我的问题已经解决了,不是我想要的方式。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
相关资源
最近更新 更多