PowerShell排序顺序不正确

时间:2017-05-11 19:59:28

标签: c# powershell sorting

所以我尝试使用PowerShell对文件顶部的C#“using”语句进行排序。对于给定的输入文件File.cs,using语句如下所示:

using System.Reflection;
using System.Configuration;
using System.Runtime.Caching;
using System.Linq;
using System;

我希望输出“使用System”作为第一个“使用”,但实际上Sort-Object将它排序到底部。如何更改此选项以排序到列表顶部?

function Update-UsingStatements
{
  param (
    [Parameter(Mandatory=$true)][string]$FilePath
  )

  $fileLines = Get-Content $FilePath
  $contents = $fileLines | Out-String

  $list = New-Object 'System.Collections.Generic.List[string]'
  $contents | Select-String -pattern 'using\s[\w\.]+;' -AllMatches | ForEach-Object {$_.Matches} | ForEach-Object { $list.Add($_.Value) }
  $list = $list | Sort-Object

  for ($i = 0; $i -lt $list.Count; $i++)
  {
    $fileLines[$i] = $list[$i]
  }

  $fileLines | Out-File $FilePath -Encoding utf8
}

2 个答案:

答案 0 :(得分:5)

您正在获取该排序顺序,因为字符串包含尾随;,而字符表;(ASCII字符59)位于.之后(ASCII字符46)。所以排序顺序绝对正确,即使它不是你所期望的。

从属性中删除尾随分号,以便对其进行排序:

$list = $list | Sort-Object { $_ -replace ';' }

答案 1 :(得分:3)

使用Ansgar Wiechers的排序调整作为主要修复,你可以摆脱很多你自己计算其余代码中的扭曲的问题:

function Update-UsingStatements
{
  param (
    [Parameter(Mandatory=$true)][string]$FilePath
  )

  # Separate the 'using' statements from everything else
  $using, $rest = (Get-Content -Path $FilePath).where({$_ -match '^using '}, 'split')

  # sort the 'using' statements, with a tweak to bring 'using system;' to the top
  $using = $using | Sort-Object -Property { $_ -replace ';' }

  # output sorted 'using' statements and rest of file, over the original file
  $using, $rest | Set-Content -Path $FilePath -Encoding UTF8

}