我有一個使用文本檔案構建陣列串列的腳本,如下所示:
$Hosts=[System.Collections.ArrayList]@(ForEach ($l in (get-content .\Config.conf | Where-Object {$_ -match "Host..="} | Where-Object {$_ -notmatch "#"})) {($l.split('=')[1]).split(",")[0]})
現在我需要將其更改為多維陣列,但我嘗試的任何方法都不起作用;所以此時我很好奇,陣列串列可以是多維的嗎?
我嘗試了幾種不同的語法,例如:
$Hosts=[System.Collections.ArrayList]@((),())
$Hosts=[System.Collections.ArrayList]@(@(),@())
$Hosts=[System.Collections.ArrayList]@(,(),())
我什至嘗試構建 2 個陣列串列,然后將它們組合如下:
$Hosts=[System.Collections.ArrayList]@(ForEach ($l in (get-content .\Config.conf | Where-Object {$_ -match "Host..="} | Where-Object {$_ -notmatch "#"})) {($l.split('=')[1]).split(",")[0]})
$Location=[System.Collections.ArrayList]@(ForEach ($l in (get-content .\Config.conf | Where-Object {$_ -match "Host..="} | Where-Object {$_ -notmatch "#"})) {($l.split('=')[1]).split(",")[1]})
$NewArry[System.Collections.ArrayList]@(($Hosts),($Location))
我嘗試過的所有東西都變成了一維陣列。
我正在使用一個陣列串列,所以我可以修改陣列而不重建它......基本上我使用該陣列的第一個邏輯是 ping 測驗,我洗掉了無回應的主機......我現在需要關聯位置給主人;我認為我需要做的方法是構建多維陣列,這樣當一個無回應的主機被洗掉時,相關的位置也會被洗掉......這樣位置串列和主機串列就不會變得不匹配.
請讓我知道您的想法,包括是否有完全不同的方法。請記住,我不能使用常規的 PowerShell 陣列,因為每次我需要對其進行更改時,重建陣列都需要很長時間。謝謝!
uj5u.com熱心網友回復:
與其嘗試將主機和位置詳細資訊決議為兩個單獨的串列,不如創建一個物件串列,其中兩條資訊都作為屬性附加:
$list = foreach($line in Get-Content .\Config.conf | Where-Object {$_ -match "Host..="} | Where-Object {$_ -notmatch "#"}){
# parse the line, extract relevant details
$value = $line.Split('=')[1]
$hosthame,$location = $value.Split(',')
# Create a new object
[pscustomobject]@{
Hostname = $hostname
Location = $location
}
}
現在您可以根據單個屬性值查詢您的資料:
PS ~> $list |Where-Object Hostname -like "*myPC*"
Hostname Location
-------- --------
myPC-01 Hogwarts
uj5u.com熱心網友回復:
馬蒂亞斯有用的答案是無疑是最好的解決方案,您的問題(雖然你可能想使用[System.Collections.ArrayList] $list = foreach ...使$list一個可調整大小的資料結構,您可以從洗掉元素)。
按照您的要求回答您的問題:
與陣列不同,
System.Collections.ArrayList實體不能是多維的。但是,您可以嵌套它們,以創建與鋸齒狀陣列類似的可調整大小的陣列,即陣列串列的陣列串列。
注意:以上內容也適用于相關的泛型System.Collections.Generic.List[T]型別,這對于型別安全和潛在更好的性能可能更可取。
一個簡化的例子:
# You can place any statement inside @(...) to initialize the nested lists.
# Use [System.Collections.ArrayList] @() or [System.Collections.ArrayList]::new()
# to start with empty lists.
$nestedArrayList =
[System.Collections.ArrayList] (
[System.Collections.ArrayList] @('host1', 'host2'),
[System.Collections.ArrayList] @('location1', 'location2')
)
例如,現在,$nestedArrayList[0][1]yieldshost2并從第二個串列中$nestedArrayList[1].RemoveAt(0)洗掉location1。
至于你嘗試了什么:
()是語法錯誤 - 僅@()適用于創建空陣列。[System.Collections.ArrayList] @(@(),@())作業語法,而是由清晰度-固定大小使得陣列串列的元素陣列。
也就是說,您將無法從這些嵌套陣列中添加或洗掉元素(盡管您可以分配新陣列 - 或任何其他型別的物件,就此而言,假設ArrayList具有object-typed 元素)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/385552.html
上一篇:將相對路徑轉換為絕對字串路徑
