[英]PowerShell: Array to multiple array
我有一個簡單的數組,使用以下內容創建(循環未顯示)
$tmpArray += $AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string + ";" + $_.Value
是否有可能將內容添加到多維數組?
稍后我將不得不過濾條目。 有了這個設置,這是不可能的。 我在以下人員的幫助下進行了嘗試
$list = ConvertFrom-Csv $tmpArray -Header "GroupID", "Language", "TextID", "Text" -Delimiter ";"
$list | Sort-Object -Property GroupID, Language, TextID#
不幸的是,轉換為 excel 並沒有導致列分離......
請在這里找到我的代碼
foreach ($file in $fileNames) {
$Content = [xml](Get-Content -Path $file.FullName)
$ns = New-Object System.Xml.XmlNamespaceManager($Content.NameTable)
$ns=@{DEF="http://br-automation.co.at/AS/VC/Project"}
$AlarmgroupIndex = Select-Xml -Xml $Content -XPath "//DEF:Property[contains(@Name,'Index')]" -namespace $ns | select -ExpandProperty node
$AlarmgroupIndexString = $AlarmgroupIndex.Value
$AlarmgroupLanguageText = Select-Xml -Xml $Content -XPath "//DEF:TextLayer" -namespace $ns | select -ExpandProperty node
$AlarmgroupIndexMap = Select-Xml -Xml $Content -XPath "//DEF:Index" -namespace $ns | select -ExpandProperty node
$LUT =@{}
$AlarmgroupIndexMap | foreach{
$LUT.($_.ID) = $_.Value
}
$tmpArray =@()
$AlarmgroupLanguageText | foreach{
$LanguageIDString = $_.LanguageId
$AlarmgroupTextLayer = Select-Xml -Xml $Content -XPath "//DEF:TextLayer[@LanguageId='$LanguageIDString']/DEF:Text" -namespace $ns | select -ExpandProperty node
$AlarmgroupTextLayer | foreach{
if($LUT.ContainsKey($_.ID))
{
$ID_string = $LUT[$_.ID]
}
$tmpArray += $AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string + ";" + $_.Value
}
$LanguageIDString=""
}
$tmpArray | Out-File "$rootPath\test.txt" -Append -Encoding utf8
$list = ConvertFrom-Csv $tmpArray -Header 'GroupID', 'Language', 'TextID', 'Text' -Delimiter ";"
$list | Sort-Object -Property GroupID, Language, TextID
}
TIA
首先:
$AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string + ";" + $_.Value
$AlarmgroupIndexString + ";" + $LanguageIDString + ";" + $ID_string + ";" + $_.Value
不是數組而是字符串(子字符串用分號分隔)+=
) 來創建集合(或字符串),因為它是指數級的(意味着成本會隨着每次迭代而增加)。 遺憾的是,您沒有顯示有關循環的更多詳細信息,因為您的問題實際上取決於您如何初始化$tmpArray
變量:
$tmpArray = ''
) 或$Null
$tmpArray = ''
,它將繼續附加到該字符串。$tmpArray = @()
) $tmpArray = @()
,它將繼續附加數組(這可能是您要查找的位置)。 如果您打算使用ConvertFrom-Csv
您還可以考慮以字符串開頭並用換行符分隔每一行(例如... + $_.Value + "`r`n"
)
無論如何,使用ConvertFrom-Csv
構建 PowerShell 對象集合也不是一個好主意(原因之一:它將所有值轉換為字符串),正確的 PowerShell 方法是:
$List = 1..3 | Foreach-Object { # replace 1..3 with your enumerator
[pscustomobject]@{
AlarmIndex = $AlarmgroupIndexString
LanguageIndex = $LanguageIDString
ID = $ID_string
Value = $_.Value
}
}
}
根據問題中添加的信息進行更新:
我不確定您的應用程序到底應該做什么,但循環應該是這樣的:
$list = $AlarmgroupLanguageText | foreach {
$LanguageIDString = $_.LanguageId
$AlarmgroupTextLayer = Select-Xml -Xml $Content -XPath "//DEF:TextLayer[@LanguageId='$LanguageIDString']/DEF:Text" -namespace $ns | select -ExpandProperty node
$AlarmgroupTextLayer | foreach{
if($LUT.ContainsKey($_.ID))
{
$ID_string = $LUT[$_.ID]
}
[pscustomobject]@{
GroupID = $AlarmgroupIndexString
Language = $LanguageIDString
TextID = $ID_string
Text = $_.Value
}
}
}
$list | Sort-Object -Property GroupID, Language, TextID
我建議您快速瀏覽一下這篇文章: https : //www.andreasbijl.com/powershell-create-collections-of-custom-objects/
您可以使用上面鏈接中描述的示例生成所需的列表。 對於您的情況,它應該類似於:
$list = New-Object System.Collections.ArrayList
your_foreach_loop
{
$temp = New-Object System.Object
$temp | Add-Member -MemberType NoteProperty -Name "GroupID" -Value $AlarmgroupIndexString
$temp | Add-Member -MemberType NoteProperty -Name "Language" -Value $LanguageIDString
$temp | Add-Member -MemberType NoteProperty -Name "TextID" -Value $ID_string
$temp | Add-Member -MemberType NoteProperty -Name "Text" -Value $_.Value
$list.Add($temp)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.