不知道我做錯了什么,但是在將 Powershell 中的 PSCustomObject 復制到陣列元素時,這是通過參考復制的。看到這個:
$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = [PSCustomObject]@()
}
$mediaItem = [PSCustomObject]@{
description = "";
simpleMediaItem = [PSCustomObject]@{
fileName = "";
uploadToken = "";
}
}
$mediaItem.description = "Friend of Mickey Mouse"
$mediaItem.simpleMediaItem.fileName = "Goofy.txt"
$mediaItem.simpleMediaItem.uploadToken = "1111"
$body.newMediaItems = $mediaItem.PsObject.Copy()
$mediaItem.description = "Friend of Rocker Duck"
$mediaItem.simpleMediaItem.fileName = "Donald Duck.txt"
$mediaItem.simpleMediaItem.uploadToken = "2222"
$body.newMediaItems = $mediaItem.PsObject.Copy()
$body | ConvertTo-Json -depth 4
輸出:
{
"albumId": null,
"newMediaItems": [
{
"description": "Friend of Mickey Mouse",
"simpleMediaItem": {
"fileName": "Donald Duck.txt",
"uploadToken": "2222"
}
},
{
"description": "Friend of Rocker Duck",
"simpleMediaItem": {
"fileName": "Donald Duck.txt",
"uploadToken": "2222"
}
}
]
}
uj5u.com熱心網友回復:
.psobject.Copy()執行實體的淺(成員)克隆[pscustomobject]。
由于您的simpleMediaItem屬性包含對.NET 參考型別(恰好是另一個[pscustomobject]實體)的參考,因此復制的是參考,以便[pscustomobject]通過.psobject.Copy()參考完全相同的物件獲得原始和克隆。
對于深度(遞回)克隆(沒有通用解決方案),您必須創建自定義實作。
您可以使用自class定義定義完全避免該問題:
class MediaItem {
[string] $description
[pscustomobject] $simpleMediaItem = [pscustomobject] @{
fileName = ""
uploadToken = ""
}
}
現在,您可以在[MediaItem]::new()每次需要一個新的獨立實體時簡單地使用。
把它們放在一起:
class MediaItem {
[string] $description
[pscustomobject] $simpleMediaItem = [pscustomobject] @{
fileName = ""
uploadToken = ""
}
}
$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = @()
}
# Create a new instance.
$mediaItem = [MediaItem]::new()
$mediaItem.description = "Friend of Mickey Mouse"
$mediaItem.simpleMediaItem.fileName = "Goofy.txt"
$mediaItem.simpleMediaItem.uploadToken = "1111"
$body.newMediaItems = $mediaItem
# Create a new instance.
$mediaItem = [MediaItem]::new()
$mediaItem.description = "Friend of Rocker Duck"
$mediaItem.simpleMediaItem.fileName = "Donald Duck.txt"
$mediaItem.simpleMediaItem.uploadToken = "2222"
$body.newMediaItems = $mediaItem
$body | ConvertTo-Json -Depth 4
uj5u.com熱心網友回復:
您所看到的是預期的,您只是在復制基礎物件。我還建議您使用function或class 來執行此操作,這會更容易并且不需要復制。
$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = [PSCustomObject]@()
}
$mediaItem = [PSCustomObject]@{
description = "";
simpleMediaItem = [PSCustomObject]@{
fileName = "";
uploadToken = "";
}
}
$mediaItem.description = "Friend of Mickey Mouse"
$mediaItem.simpleMediaItem.fileName = "Goofy.txt"
$mediaItem.simpleMediaItem.uploadToken = "1111"
$body.newMediaItems = $mediaItem
$base = $mediaItem.PsObject.Copy()
$child = $mediaItem.simpleMediaItem.PSObject.Copy()
$base.description = "Friend of Rocker Duck"
$child.fileName = "Donald Duck.txt"
$child.uploadToken = "2222"
$base.simpleMediaItem = $child
$body.newMediaItems = $base
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399960.html
