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

Sort lines within file based on folder in path

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

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

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

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

$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
}

如果路径始终相同: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