所以我尝试使用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
}
答案 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
}