【发布时间】:2017-04-18 16:30:00
【问题描述】:
我最近开始在 PowerShell 中编写脚本,但在按多列对二维数组进行排序时遇到了困难。
以下代码运行良好。我有一个二维数组(5x4),我按两列对其进行排序;首先是第二列,然后是第一列。
$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"
]
]
现在,如果我使用另一个数组,即只有一行的“表”,排序会使数组变平。
$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"
]
当只有一行时会发生这种情况。这是为什么呢?
【问题讨论】:
-
这是使您的单项数组变平的管道。使用
Sort-Object -InputObject $table2就不会发生 -
@MathiasR.Jessen 您的建议似乎不起作用。它只是返回不变的
$table2(也是$table1)。我检查了Sort-Object | SS64.com 和How does -InputObject work?。没有任何示例明确使用-InputObject。你能提供一个工作代码吗? -
$table2_sorted = @( $table2 | Sort-Object ... ) -
@PetSerAl 奇怪的是,这行得通。如果我做对了,您将返回的值包装在一个数组中。我认为它还会将多行数组
$table1包装在另一个数组中,因此它会变成一个 3D 数组,但事实并非如此。它只是用一排$table2包装一个。我可以依靠这个吗?为什么不将$table1包装在一个数组中?
标签: arrays sorting powershell multidimensional-array