2016-12-04 126 views
0

我最近在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-Hostecho,它们都使阵列变平并且不会分开项目(项目之间没有逗号),例如

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" 
] 

这种情况发生时,只有一个排。这是为什么?

+0

这是变平的一个项目阵列的管道。使用'排序对象 - 输入对象$ table2',它不会发生 –

+0

@ MathiasR.Jessen你的建议似乎没有工作。它只是返回'$ table2'(也是'$ table1')不变。我检查了[Sort-Object | SS64.com](http://ss64.com/ps/sort-object.html)和[如何使用-InputObject工作?](http://stackoverflow.com/a/35292369/2202732)。没有任何显式使用'-InputObject'的例子。你能提供一个工作代码吗? – akinuri

+1

'$ table2_sorted = @($ table2 | Sort-Object ...)' – PetSerAl

回答

0

Sort-Object不返回数组。它返回以排序顺序写入管道单个输入项目。

PS> 7,3,8,5,1 | Sort-Object | ForEach-Object { Write-Host "Item: $_" } 
Item: 1 
Item: 3 
Item: 5 
Item: 7 
Item: 8 

正如你所看到的,在管道ForEach-Object下一个命令来查看各个项目,而不是数组作为整体。

包装到$table1中的数组会发生,因为管道中的最后一个命令在流水线中写入了多个项目。在$table2的情况下,管道中的最后一条命令只写了一个项目,所以没有必要的包装。如果你想始终包裹管道结果存入数组不管结果(零,一个或多个)的量,那么你需要使用数组子表达式运算符:

$Results = @(First-Command | Middle-Command | Last-Command) 
+0

因此,写入“管道”的多个项目被视为一个数组,因此'$ table1_sorted'是一个数组数组。 '$ table2_sorted'不是2D,因为'Sort-Object'“返回”只有一个项目,而一个项目不会被视为一个数组。如果我将数组的排序输出包装在'$ sorted = @($ table | Sort-Object ...)'中,我总是会得到一个包含项目的数组,无论项目数量是多少。现在有道理。 – akinuri