根据路径中的文件夹对文件中的行进行排序

时间:2015-07-15 20:27:42

标签: sorting powershell scripting filesystems

我有一个包含以下行的文件

c:\scripts\oltp\db1\scripts\scripts1.sql
c:\scripts\oltp\db1\tables\scripts1.sql
c:\scripts\oltp\db1\storedprocedures\scripts1.sql
c:\scripts\oltp\db1\functions\scripts1.sql
c:\scripts\oltp\db1\tables\scripts2.sql
c:\scripts\oltp\db1\storedprocedures\scripts2.sql

我正在寻找一个PowerShell脚本,可以根据列表进行排序,如下所述......

Tables,storedprocedures,views,scripts,everything else.....

我的预期输出是

c:\scripts\oltp\db1\tables\scripts1.sql
c:\scripts\oltp\db1\tables\scripts2.sql
c:\scripts\oltp\db1\storedprocedures\scripts1.sql
c:\scripts\oltp\db1\storedprocedures\scripts2.sql
c:\scripts\oltp\db1\scripts\scripts1.sql
c:\scripts\oltp\db1\functions\scripts1.sql

3 个答案:

答案 0 :(得分:3)

Sort-Object -Property可以将匿名计算属性作为参数。根据您的排序标准在表达式中放置一个开关:

function Test-CustomSort {
    $ScriptNames  = @(
        'c:\scripts\oltp\db1\scripts\scripts1.sql'
        'c:\scripts\oltp\db1\tables\scripts1.sql'
        'c:\scripts\oltp\db1\storedprocedures\scripts1.sql'
        'c:\scripts\oltp\db1\functions\scripts1.sql'
        'c:\scripts\oltp\db1\tables\scripts2.sql'
        'c:\scripts\oltp\db1\storedprocedures\scripts2.sql'
    )

    $ScriptNames | Sort-Object @{Expression={
        switch(Split-Path -Parent $_ | Split-Path -Leaf){
            "tables"           { 1 }
            "storedprocedures" { 2 }
            "views"            { 3 }
            "scripts"          { 4 }
            default            { 5 }
        }
    }}
}

产地:

PS C:\> Test-CustomSort
c:\scripts\oltp\db1\tables\scripts1.sql
c:\scripts\oltp\db1\tables\scripts2.sql
c:\scripts\oltp\db1\storedprocedures\scripts1.sql
c:\scripts\oltp\db1\storedprocedures\scripts2.sql
c:\scripts\oltp\db1\scripts\scripts1.sql
c:\scripts\oltp\db1\functions\scripts1.sql

答案 1 :(得分:2)

您可以按目录对路径进行分组,将它们放入哈希表中,然后按所需顺序输出哈希表。

$categories = 'tables', 'storedprocedures', 'views', 'scripts', 'functions'

$ht = @{}
Get-Content 'C:\path\to\your.txt' |
  Group-Object { Split-Path -Parent $_ | Split-Path -Leaf } |
  ForEach-Object { $ht[$_.Name] = $_.Group }

$categories | ForEach-Object {
  $ht[$_] | Sort-Object
}

答案 2 :(得分:-1)

如果路径始终相同:c:\ scripts \ oltp \ db1 \

(gc .\list.txt) | %{$_ -replace 'c:\\scripts\\oltp\\db1\\', ''} | Sort

输出

functions\scripts1.sql
scripts\scripts1.sql
storedprocedures\scripts1.sql
storedprocedures\scripts2.sql
tables\scripts1.sql
tables\scripts2.sql