最近PowerShellでスクリプトを開始しましたが、2D配列を複数の列でソートするのは難しいです。2D配列を1行で並べ替える
次のコードは正常に動作しています。私は2次元配列(5x4)を持っていて、2つの列で並べ替えます。最初に、2番目の列で、次に1番目の列で表示されます。
$table1 = ("hhctrl.ocx",21,503,"Microsoft® HTML Help Control"),("mscomct2.ocx",10,629,"Microsoft Common Controls 2 ActiveX Control DLL"),("msscript.ocx",2,86,"Microsoft ® Script Control"),("sysmon.ocx",15,384,"System Monitor Control"),("tdc.ocx",1,61,"TDC ActiveX Control")
$table1_sorted = $table1 | Sort-Object @{Expression={$_[1]}; Ascending=$false}, @{Expression={$_[0]}; Ascending=$true}
echo (var_dump $table1)
echo (var_dump $table1_sorted)
var_dump
はカスタム関数です。私は配列をデバッグするためにそれを作成しました。 Write-Host
およびecho
の場合、それらは配列を平坦化し、項目を区切りません(項目間のコンマはありません)。
hhctrl.ocx 21 503 Microsoft® HTML Help Control mscomct2.ocx 10 629 Microsoft Common Controls 2 ActiveX Control DLL msscript.ocx 2 86 Microsoft ® Script Control sysmon.ocx 15 384 System Monitor Control tdc.ocx 1 61 TDC ActiveX Control
var_dump
出力:
[
[
"hhctrl.ocx",
21,
503,
"Microsoft® HTML Help Control"
],
[
"mscomct2.ocx",
10,
629,
"Microsoft Common Controls 2 ActiveX Control DLL"
],
[
"msscript.ocx",
2,
86,
"Microsoft ® Script Control"
],
[
"sysmon.ocx",
15,
384,
"System Monitor Control"
],
[
"tdc.ocx",
1,
61,
"TDC ActiveX Control"
]
]
[
[
"hhctrl.ocx",
21,
503,
"Microsoft® HTML Help Control"
],
[
"sysmon.ocx",
15,
384,
"System Monitor Control"
],
[
"mscomct2.ocx",
10,
629,
"Microsoft Common Controls 2 ActiveX Control DLL"
],
[
"msscript.ocx",
2,
86,
"Microsoft ® Script Control"
],
[
"tdc.ocx",
1,
61,
"TDC ActiveX Control"
]
]
Iは一行と別の配列、 "テーブル" を使用する場合は、ソートはアレイを平ら。
$table2 = ,("hhctrl.ocx",21,503,"Microsoft® HTML Help Control")
$table2_sorted = $table2 | Sort-Object @{Expression={$_[1]}; Ascending=$false}, @{Expression={$_[0]}; Ascending=$true}
echo (var_dump $table2)
echo (var_dump $table2_sorted)
出力:一つだけの行があるとき
[
[
"hhctrl.ocx",
21,
503,
"Microsoft® HTML Help Control"
]
]
[
"hhctrl.ocx",
21,
503,
"Microsoft® HTML Help Control"
]
この問題が発生しました。何故ですか?
:あなたは関係なく、常に結果(ゼロ、1または多数)の量の配列にパイプラインの結果をラップする場合は、配列の部分式演算子を使用する必要があります。 'Sort-Object -InputObject $ table2'を使用してもそれは起こりません –
@ MathiasR.Jessenあなたの提案はうまくいかないようです。 '$ table2'(' $ table1'も)をそのまま返します。私は[Sort-Object | SS64.com](http://ss64.com/ps/sort-object.html)と[どのように-InputObjectが動作するのですか?](http://stackoverflow.com/a/35292369/2202732)を参照してください。 '-InputObject'を明示的に使用する例はありません。作業コードを提供できますか? – akinuri
'$ table2_sorted = @($ table2 | Sort-Object ...)' – PetSerAl