Powershell - 使用特殊字符对字符串对象进行排序

2024-01-28

我在跑

'S-tst','ssrst','srst2','s-zaa','s-a','s-zf' | Sort-Object

我不应该得到回报吗

s-a
S-tst
s-zaa
s-zf
srst2
ssrst

但我得到以下信息:

s-a
srst2
ssrst
S-tst
s-zaa
s-zf

这怎么可能 ?排序对象在排序时只看字母吗?有什么办法可以按特殊字符排序吗?


这种行为是设计使然,但并不总是人们想要/期望的。如果您希望字符串按 ASCII 顺序对每个字符进行排序,请使用以下命令:

Add-Type @"
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Globalization;

    public class SimpleStringComparer: IComparer, IComparer<string>
    {

        private static readonly CompareInfo compareInfo = CompareInfo.GetCompareInfo(CultureInfo.InvariantCulture.Name);

        public int Compare(object x, object y)
        {
            return Compare(x as string, y as string);
        }
        public int Compare(string x, string y)
        {
            return compareInfo.Compare(x, y, CompareOptions.OrdinalIgnoreCase);
        }
        public SimpleStringComparer() {}
    }
"@


[string[]]$myList = 's-a','s-a1','s''a','s''a1', 'sa','sa1','s^a','S-a','S-a1','S''a','S''a1', 'Sa','Sa1','S^a'

[System.Collections.Generic.List[string]]$list = [System.Collections.Generic.List[string]]::new()
$list.AddRange($myList)
[SimpleStringComparer]$comparer = [SimpleStringComparer]::new()
$list.Sort([SimpleStringComparer]::new())
$list

Outputs:

s'a
S'a
s'a1
S'a1
s-a
S-a
s-a1
S-a1
sa
Sa
sa1
Sa1
s^a
S^a

更多信息

Per @TesselttingHeckler在注释中,您可以通过将字符串转换为 char 数组来按字符代码(序数)顺序对字符串进行排序。然而,这仍然以一种可能意想不到的方式处理连字符和撇号(因为这些字符被忽略):

$myList = 's-a','s-a1','s''a','s''a1', 'sa','sa1','s^a','S-a','S-a1','S''a','S''a1', 'Sa','Sa1','S^a'
$myList | Sort-Object -Property { [char[]] $_ }
s'a
S'a
s-a
S-a
s'a1
S'a1
s-a1
S-a1
s^a
S^a
sa
Sa
sa1
Sa1

当前的排序行为是设计使然。 PowerShell 似乎实现了“词排序”。此处记录了这一点:https://msdn.microsoft.com/en-us/library/windows/desktop/dd318144(v=vs.85).aspx#SortingFunctions https://msdn.microsoft.com/en-us/library/windows/desktop/dd318144(v=vs.85).aspx#SortingFunctions

除了忽略连字符和撇号(除非比较其他相同的字符串时),这种排序还将标点符号视为位于字母数字之前,并将重音字母与对应的字母一起处理。一个简单的演示如下所示:

32..255 | %{[string][char][byte]$_} | sort

要定义其他排序行为,目前您可能需要深入了解 .Net,如下所示:

Add-Type @"
    using System;
    using System.Runtime.InteropServices;
    using System.Collections;
    public class NumericStringComparer: IComparer
    {
        //https://msdn.microsoft.com/en-us/library/windows/desktop/bb759947%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
        [DllImport("shlwapi.dll")]
        public static extern int StrCmpLogicalW(string psz1, string psz2);
        public int Compare(object x, object y)
        {
            return Compare(x as string, y as string);
        }
        public int Compare(string x, string y)
        {
            return StrCmpLogicalW(x, y);
        }
        public NumericStringComparer() {}
    }
"@

[System.Collections.ArrayList]$myList = 's-a','s-a1','s''a','s''a1', 'sa','sa1','s^a','S-a','S-a1','S''a','S''a1', 'Sa','Sa1','S^a', , '100a','1a','001a','2a','20a'
$myList.Sort([NumericStringComparer]::new())
$myList -join ', '

上面的字符串按照 Windows 资源管理器的方式排序(即将前导数字视为数值):

s'a, s'a1, S'a, s-a, S-a, S-a1, S'a1, s-a1, S^a, s^a, 1a, 001a, 2a, Sa, Sa1, sa, sa1, 20a, 100a

我已经提交了一个功能建议,以提供更多 PS 友好的解决方案Sort-Object. See https://github.com/PowerShell/PowerShell/issues/4098 https://github.com/PowerShell/PowerShell/issues/4098

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell - 使用特殊字符对字符串对象进行排序 的相关文章

  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • Powershell 错误:方法调用...不包含名为“replace”的方法

    我想使用 PowerShell 搜索并替换 xml 文件中的字符串 我试过这个 gc d test xml replace 1234 xxxx sc d test xml 这对于我的 test xml 文件效果很好 我的 test xml
  • 对模板之一的 observableArray 进行排序

    我有以下视图模型 function instance id FirstName extend this id ko observable id FirstName ko observable FirstName 我在 observableA
  • 按序列大小对 fasta 进行排序

    我目前想按序列大小对 hudge fasta 文件 10 8 行和序列 进行排序 fasta 是生物学中用于存储序列 遗传或蛋白质 的明确定义的格式 gt id1 序列 1 可以位于多行 gt id2 序列2 我运行了一个提供 tsv 格式
  • 对 Objective-c 对象数组进行排序

    所以我有一个自定义课程Foo有许多成员 interface Foo NSObject NSString title BOOL taken NSDate dateCreated 在另一堂课上我有一个NSMutableArray包含这些对象的列
  • Powershell 调用程序集委托

    我有一个用于过程控制应用程序的 dll 程序集 我在我的内部使用 load电源外壳 script 该DLL包含我需要使用的委托类型 委托名称是 X Y Delegate 我在该 DLL 中有另一个方法 应该这样调用 Method deleg
  • PowerShell 中的“nohup”相当于什么?

    如何模拟 unix 命令的行为nohup在 PowerShell 中 那是nohup my other nonblocking command 我注意到Start Job命令 但是语法对我来说有点不清楚 gt Start Job my ex
  • Azure 函数核心工具安装卡在 Visual Studio Code 中

    我创建了 Azure 函数应用程序来执行 powershell 脚本 想先在我的本地运行它来测试它 当我运行它时 无论有没有调试选项 都会出现一个弹出窗口 其中显示 您必须安装 Azure Functions 核心工具才能调试本地函数 当我
  • 对 Python 中的嵌套字典进行排序

    我有以下字典 var a Black grams 1906 price 2 05 Blue grams 9526 price 22 88 Gold grams 194 price 8 24 Magenta grams 6035 price
  • 如何使用 SQL Server 查询对“版本号”列进行排序

    我想知道我们当中的 SQL 天才是否可以向我伸出援助之手 我有一个专栏VersionNo在表中Versions包含 版本号 值 例如 VersionNo 1 2 3 1 1 10 3 1 1 4 7 2 etc 我正在寻找对此进行排序 但不
  • 数组排序错误:“二元运算符 '<' 无法应用于两个 'Int?'操作数”

    这是按 tableView 时间戳中的每个单元格对数组进行排序的代码 self ProjectsArray sorted by project project2 gt Bool in return project timestamp int
  • 如何在 powershell 中使用正则表达式选择“catch”代码块?

    我正在尝试分析多个目录中的大量 powershell 脚本 并且希望将任何 Catch 代码块拉入列表 变量中 我正在尝试编写一个正则表达式来选择以下格式的任何块 Catch write Host Function MyInvocation
  • 如何扩展和重写集合类中的 Add

    背景 我在 PowerShell 中有一个具有 4 个属性的数据对象 其中 3 个是字符串 第 4 个是哈希表 我想安排一个新类型 将其定义为该数据对象的集合 在这个集合类中 我希望强制执行一种特定的格式 这将使我在模块中其他地方的代码更加
  • 按日期对图表中的 X 轴进行排序 - JavaFX

    如何按日期对折线图 X 轴进行排序 现在我的折线图看起来像这样 我试图剪切日期并将其转换为 int 但现在我不知道该怎么办 datesToCompare addAll LastHoursAndDates keySet dates in St
  • C - 对浮点数组进行排序,同时跟踪索引

    我有一个包含 3 个浮点值的数组 float norms 3 norms 0 0 4 norms 1 3 2 norms 2 1 7 我想按降序对这个数组进行排序同时跟踪数组中值的原始索引 换句话说 给定数组norms 0 4 3 2 1
  • 并行启动服务

    我有一个脚本可以检查不同服务器上的某些服务是否已启动 如果没有启动 该脚本应该启动该服务 问题是 它不会并行启动服务 而是等待每个服务启动 Code server list Get Content path D Path list of s
  • 是否可以要求 Powershell 在 Windows 终端而不是新窗口中启动进程

    如果我在 Windows 终端 PowerShell 选项卡中运行 start process Powershell Verb runas 它将创建一个新窗口 有没有办法在 Windows 终端中创建选项卡 您必须使用 Windows 终端
  • 通过将密码与命令一起传递,使用 powerShell 脚本进行 ssh

    如果我输入 我可以从 PowerShell ssh 到服务器 ssh 用户名 主机 这会提示输入密码 我输入有效的密码 但我试图编写一个脚本 通过 ssh 进入服务器执行一些脚本并返回 所以我必须传递密码和命令我该怎么做 关于 shell
  • 如何使用 PowerShell 查找 CPU 和 RAM 使用情况?

    我试图让 PowerShell 提供 RAM 和 CPU 使用情况 但我无法弄清楚要使用哪个 WMI 类 我的计算机有两个处理器 因此拥有这两个处理器的信息会很有用 您还可以使用 Get Counter cmdlet PowerShell
  • Powershell:复制时自动更改文件属性

    我有一个只读文件的文件夹 当我将这些文件之一复制到测试位置时 我希望能够复制它们而不保留其原始属性 我可以做到这一点 但这很长 copy item srcfilefullname destfilefullname set itemprope

随机推荐

  • WPF - 有没有办法从 Canvas.Children 中删除特定的子项?

    我正在开发一个图表控件 在其中绘制 分析范围 它只是图表上的两条垂直线 当我想更改分析范围时 就会出现问题 因为我不知道如何仅删除两条分析范围线 所以我最终会清除图表并再次绘制实际数据值等等 有没有办法标记这些 UI 元素 即分析范围是网格
  • 无法在 Xcode 4.5 中为单个 ViewController 类加载两个笔尖 (.XIB) [重复]

    这个问题在这里已经有答案了 提前抱歉 我知道已经有很多类似的问题了 我尝试了所有解决方案 但没有任何一个对我有用 我正在使用 Xcode 4 5 2 并使用两个用于 iphone 5 ios 6 的 xib1 gt 根视图控制器5以及所有其
  • 将过滤器应用于数据集时,不在 gridview 中显示数据

    我的gridview在过滤时不显示数据 protected void Page Load object sender EventArgs e OleDbConnection conn new OleDbConnection Provider
  • 如何向 request.POST 添加信息?

    当用户使用表单创建内容时 所有信息都通过表单提交 该表单通过 AJAX 调用发送到以下视图 def goal create request if request method POST user request user request P
  • AS3 中的 Mixin 或 Trait 实现?

    我正在寻找有关如何实施的想法混合 特质 http debasishg blogspot com 2006 04 scala compose classes with mixins htmlAS3 中的样式系统 我希望能够将多个类组合成一个对
  • 如何显示 UIWebView 的滚动指示器

    我有一个UIWebView对于某些内容 我需要使其滚动指示器在短时间内可见 例如 UIScrollView flashScrollIndicators 知道如何做到这一点吗 从 iOS 5 0 开始 现在可以通过访问 scrollview
  • 在某些设备上,选项菜单不会出现在操作栏中

    我的操作栏中有一个选项菜单 但它不会出现在某些具有硬件菜单按钮的设备上 尽管有硬件按钮 我必须让它出现在操作栏中 我该怎么做 把这个放在你的onCreate method try ViewConfiguration config ViewC
  • Controller.User 在单元测试期间为 Null

    我的控制器操作方法中有以下代码 if User Identity IsAuthenticated 看起来效果很好 但是当我运行调用此操作的单元测试时 它失败了 因为User一片空白 谁能建议处理这个问题的最佳方法 我是否必须仅为单元测试而重
  • 在 IIS 8.0 上设置 asp.net 项目时出现 HTTP 错误 404.17

    我正在尝试在 Windows 8 计算机上的 IIS 8 0 上设置现有的 asp net 应用程序 但它给出了以下错误消息 HTTP Error 404 17 Not Found The requested content appears
  • 如何解组包含 DIFFGR 的 XML 代码

    JAXB 新手 我正在尝试解组XML 文档 我用的是xjc从 XSD 文件构建 DataSet 和 ObjectFactory 的命令
  • SwipeRefreshLayout 选项卡布局。 Webview无法向上滚动

    好的 我有一个选项卡视图 其中有一个网络视图 一个列表视图和一些其他页面 我希望能够执行 SwipeRefreshLayout 来刷新每个项目 我在每一页上都有这个工作 但是 当我在网络视图中向下滚动时 我无法向上滚动 它触发刷新并重建它
  • 删除最后一项时 UICollectionView 崩溃

    每当删除项目时 我都会尝试更新 uicollection 视图 所有单元格都删除得很好 但如果我删除该集合视图中的最后一个单元格 应用程序就会崩溃 并且我已将 self collectionview performBatchUpdates
  • 如何在 R 中最大化函数内的矩阵乘法

    我正在尝试最大化维度为 2x2 的矩阵参数的可能性 似然函数需要传入几个固定矩阵参数 似然也是其函数 数据 表示为 Y 和协方差矩阵 Sigma star 我将其作为下三角矩阵传递 对于计算是必要的 但我想保持这些固定并对此运行优化函数 在
  • 将指定的初始值设定项与未命名的嵌套数据类型一起使用

    我想知道是否可以在结构的未命名数据成员中使用指定的初始值设定项 哎呀 拗口 但是 是的 这是做我想做的事情的最干净的方法 如果我有 typedef struct MainStruct union uint8 t a8 16 uint64 t
  • 无法安装 Windows 版 GitHub

    当我尝试为 Windows 安装 github 时收到此错误 Application cannot be started Contact the application vendor 错误日志产生了这样的结果 PLATFORM VERSIO
  • 如何向控件添加工具提示?

    我想显示一个ToolTip当鼠标悬停在控件上时 如何在代码中以及设计器中创建工具提示 Here http msdn microsoft com en us library system windows forms tooltip aspx是
  • 如何自动将 String @RequestBody 解析为 json

    我有一个端点 它应该读取字符串值作为正文 RestController public class EndpointsController RequestMapping method RequestMethod PUT value api m
  • 使用 PDO 序列化数据是否危险

    I have 8 input type text name favour 01 我做那8个input进入一个array and serialize it i use PDO将其保存到数据库中 比反序列化它的输出 favour apple f
  • 正则表达式中的 JSLint“不安全 ^”

    JSLint 报告不安全的 对于以下行 这是为什么 或者每当我想否定某个角色类别时它就会抱怨 remove all non alphanumeric comma and dash characters 7s gd j5d a replace
  • Powershell - 使用特殊字符对字符串对象进行排序

    我在跑 S tst ssrst srst2 s zaa s a s zf Sort Object 我不应该得到回报吗 s a S tst s zaa s zf srst2 ssrst 但我得到以下信息 s a srst2 ssrst S t