我想在powershell中創建多維陣列,我嘗試過這種方式并且它有效,但我想簡化它以使其沒有重復nameand pn。哪位大神可以給個思路,萬分感謝
$array = @(
[PSCustomObject]@{name = 'PRODCT_1'; pn = 'gra-001'}
[PSCustomObject]@{name = 'PRODCT_11a'; pn = 'ght-001'}
[PSCustomObject]@{name = 'PRODCT_ca1'; pn = 'hasha-001'}
[PSCustomObject]@{name = 'PRODCT_ga1'; pn = '45-001'}
[PSCustomObject]@{name = 'PRODCT_4a1'; pn = 'aert-001'}
[PSCustomObject]@{name = 'PRODCT_ata41'; pn = '43-001'}
)
uj5u.com熱心網友回復:
沒有真正簡化,但這是您可以使用有序字典并回圈鍵/值對以創建新實體的一種方法PSCustomObject:
$dict = [ordered]@{
'PRODCT_1' = 'gra-001'
'PRODCT_11a' = 'ght-001'
'PRODCT_ca1' = 'hasha-001'
'PRODCT_ga1' = '45-001'
'PRODCT_4a1' = 'aert-001'
'PRODCT_ata41' = '43-001'
}
然后您可以使用以下任一方法創建實體.GetEnumerator():
$dict.GetEnumerator() | ForEach-Object {
[pscustomobject]@{
Name = $_.Key
Pn = $_.Value
}
}
或回圈通過Keys:
$dict.PSBase.Keys | ForEach-Object {
[pscustomobject]@{
Name = $_
Pn = $dict[$_]
}
}
最后,正如zett42建議的那樣,您可以結合.GetEnumerator()使用Select-Object計算屬性:
$dict.GetEnumerator() | Select-Object Name, @{N='Pn';E={$_.Value}}
uj5u.com熱心網友回復:
筆記
我的回答將 PSObject 陣列保留在您最初的問題中,但洗掉名稱/ pn 重復。我認為在大多數情況下,保持 PSObject 陣列結構更好(更靈活)。
如果您想要一個實際的多維陣列,Zett42的答案就是您想要的。
您可以使用函式或腳本塊呼叫。這些值將按位置分配,因此您不必每次都寫名稱 (name, pn)。
使用函式
Function Add-product($Name, $pn) { [PSCustomObject]@{name = $Name; pn = $pn } }
$array = @(
Add-product 'PRODCT_1' 'gra-001'
Add-product 'PRODCT_11a' 'ght-001'
Add-product 'PRODCT_ca1' 'hasha-001'
)
使用腳本塊呼叫
$add = {Param($Name,$pn) [PSCustomObject]@{name = $Name; pn = $pn}}
$array = @(
& $add 'PRODCT_1' 'gra-001'
& $add 'PRODCT_11a' 'ght-001'
& $add 'PRODCT_ca1' 'hasha-001'
)
使用 CSV 格式的資料
這只是另一種方法,盡管我可能永遠不會在任何情況下使用它,因為我更喜歡使用自定義函式/腳本塊的靈活性。話雖如此,它絕對是最緊湊的。
$array = @'
Name,Pn
PRODCT_1,gra-001
PRODCT_11a,ght-001
PRODCT_ca1,hasha-001
'@ | ConvertFrom-Csv
uj5u.com熱心網友回復:
這將創建一個實際的多維陣列作為生成 的陣列的基礎[pscustomobject]:
# Create multidimensional array
$temp = ('PRODCT_1', 'gra-001'),
('PRODCT_11a', 'ght-001'),
('PRODCT_ca1', 'hasha-001'),
('PRODCT_ga1', '45-001'),
('PRODCT_4a1', 'aert-001'),
('PRODCT_ata41', '43-001')
# Create single-dimensional array of pscustomobject
$array = $temp | Select-Object @{ n='name'; e={ $_[0] }},
@{ n='pn'; e={ $_[1] }}
# Output to console
$array
如果您愿意,也可以使用單個陳述句來執行此操作,而無需使用臨時變數:
$array = (
('PRODCT_1', 'gra-001'),
('PRODCT_11a', 'ght-001'),
('PRODCT_ca1', 'hasha-001'),
('PRODCT_4a1', 'aert-001'),
('PRODCT_ata41', '43-001')
) | Select-Object @{ n='name'; e={ $_[0] }}, @{ n='pn'; e={ $_[1] }}
.ForEach使用內部方法直接創建[PSCustomObject]陣列元素的更簡潔的替代方法:
$array = (
('PRODCT_1', 'gra-001'),
('PRODCT_11a', 'ght-001'),
('PRODCT_ca1', 'hasha-001'),
('PRODCT_4a1', 'aert-001'),
('PRODCT_ata41', '43-001')
).ForEach{ [PSCustomObject]@{ name = $_[0]; pn = $_[1] } }
后者也是最有效的方式,因為它不涉及管道引數系結開銷。
每個都產生相同的輸出:
name pn
---- --
PRODCT_1 gra-001
PRODCT_11a ght-001
PRODCT_ca1 hasha-001
PRODCT_ga1 45-001
PRODCT_4a1 aert-001
PRODCT_ata41 43-001
解決方案說明Select-Object:
對于 的每一“行” $temp,該Select-Object命令使用計算屬性將陣列元素轉換為物件屬性。
例如。它需要 row ('PRODCT_1', 'gra-001'),這是一個由兩個元素組成的陣列。然后@{ n='name'; e={ $_[0] }}進行處理,將索引 0 ( 'PRODCT_1') 處的元素分配給 property name。然后@{ n='pn'; e={ $_[1] }}進行處理,將索引 1 ( 'gra-001') 處的元素分配給 property pn。
這個程序對所有剩余的行重復,我們得到一個存盤在 中的物件陣列$array,就像您的原始代碼一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475910.html
標籤:数组 电源外壳 多维数组 pscustomobject
下一篇:命令在前一個完成之前運行
