我一直在嘗試根據檔案夾中所有檔案的串列在 .xml 檔案中動態創建一個串列。但是,.xml 檔案中的串列需要按一定順序排列并帶有各種資訊。
我已經成功地列出了一個清單,我只是不知道如何按照我想要的方式訂購它。
示例:D:\ 檔案夾中的檔案串列
BG.pdf
CS.pdf
EN.pdf
17.pdf
此檔案夾中可以包含任意數量的 PDF 檔案,并且創建的串列需要始終具有相同/相似的順序。基本上 17 需要排在第一位,EN 需要排在第二位,其他一切都可以按字母順序排列。
這是我到目前為止所擁有的:
$filePath = "D:\"
$list = Get-ChildItem -Path $filePath -Recurse | `
Where-Object { $_.PSIsContainer -eq $false -and $_.Extension -ne '.srt' }
New-Item $filePath’\.PDFList.txt'
$var = "<PDFList>" | Out-File -Append $filePath’\.PDFList.txt'
ForEach($n in $list){
if($n.name.Contains('EN')) {
$var = " <PDF><language>English</language><filename>" $n.Name "</filename></PDF>" | Out-File -Append $filePath’\.PDFList.txt'
} elseif($n.name.Contains('BG')) {
$var = " <PDF><language>Bulgarian</language><filename>" $n.Name "</filename></PDF>" | Out-File -Append $filePath’\.PDFList.txt'
} elseif($n.name.Contains('CS')) {
$var = " <PDF><language>Czech</language><filename>" $n.Name "</filename></PDF>" | Out-File -Append $filePath’\.PDFList.txt'
} elseif($n.name.Contains('17')) {
$var = " <PDF><language>17</language><filename>" $n.Name "</filename></PDF>" | Out-File -Append $filePath’\.PDFList.txt'
}
$var = "<PDFList>" | Out-File -Append $filePath’\.PDFList.txt'
Rename-Item -Path $filePath’\.PDFList.txt' -NewName $filePath’\.PDFList.xml'
這是目前的結果:
<PDFList>
<PDF><language>Bulgarian</language><filename>BG.pdf</filename></PDF>
<PDF><language>Czech</language><filename>CS.pdf</filename></PDF>
<PDF><language>English</language><filename>EN.PDF</filename></PDF>
<PDF><language>17</language><filename>17.pdf</filename></PDF>
<PDFList>
我希望放在 .xml 檔案中的串列是這樣的:
<PDFList>
<PDF><language>17</language><filename>17.pdf</filename></PDF>
<PDF><language>English</language><filename>EN.PDF</filename></PDF>
<PDF><language>Bulgarian</language><filename>BG.pdf</filename></PDF>
<PDF><language>Czech</language><filename>CS.pdf</filename></PDF>
<PDFList>
uj5u.com熱心網友回復:
您還可以結合使用 Array IndexOf()方法Sort-Object:
$sorted = 'GB','CS','EN','17' | Sort-Object { ('17','EN','GB','CS').IndexOf($_) }
$sorted
17
EN
GB
CS
uj5u.com熱心網友回復:
使用 PowerShell 定義自定義 .NET 類的功能來實作自定義IComparer[string],然后您可以將其與諸如Array.Sort()和 之類的方法一起使用List.Sort():
# Define our custom string comparer
class SevenTeenAndEnglishComparer : System.Collections.Generic.IComparer[string]
{
[int]
Compare([string]$a, [string]$b){
# Handle 17* first
if($a -like '17*' -and $b -notlike '17*'){
return -1
}
elseif($b -like '17*' -and $a -notlike '17*'){
return 1
}
# Handle EN* next
if($a -like 'EN*' -and $b -notlike 'EN*'){
return -1
}
elseif($b -like 'EN*' -and $a -notlike 'EN*'){
return 1
}
# Handle everything else as we normally would
return [System.StringComparer]::CurrentCultureIgnoreCase.Compare($a,$b)
}
}
# Prepare string array as input for `Array.Sort()`
$strings = -split @'
BG.pdf
CS.pdf
EN.pdf
17.pdf
'@ -as [string[]]
# Sort strings, but do it according to the logic of our new custom comparer
[array]::Sort($strings, [SevenTeenAndEnglishComparer]::new())
# Observe that strings are now ordered correctly
$strings
uj5u.com熱心網友回復:
一個實用的解決方案是使用兩個排序標準Sort-Object:
# Simulate the output from your Get-ChildItem call
$list = [System.IO.FileInfo[]] (
'CS.pdf',
'BG.pdf',
'EN.pdf',
'17.pdf'
)
$customSortedNames = (
$list | Sort-Object { $_.BaseName -notin '17', 'EN' }, BaseName
).Name
# Output the sort result
$customSortedNames
以上產生:
17.pdf
EN.pdf
BG.pdf
CS.pdf
請注意,這個相對簡單的解決方案依賴于這樣一個事實,即兩個例外的所需自定義順序 -17首先,然后EN- 也恰好反映了它們之間的詞匯排序順序。
固定數量與已知的相對排序順序稱為例外,你也可以這樣做(注意.IndexOf()是區分大小寫;對于不區分大小寫的替代,看到這個答案):
# Note that the desired order among the exceptions must be stated *in reverse*.
$list | Sort-Object { -('EN', '17').IndexOf($_.BaseName) }, BaseName
如果您需要比這更復雜的邏輯,請考慮Mathias R. Jessen 的有用答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323326.html
