# Sort

以字母, 数字或随机顺序排列变量的内容 (可以选择是否移除重复项).

Sort, VarName [, Options]

#### 参数

VarName | 内容需要排序的变量名称.
Options | 见下表.

#### 选项

由下列字母中的零个或多个组成的字符串 (顺序任意, 中间用空格隔开是可选的):

C: 区分大小写的排序 (如果 N 选项同时存在则此选项被忽略). 如果 C 和 CL 两个选项同时省略, 在排序中大写字母 A-Z 被视为等同于它们相应的小写形式.

CL [v1.0.43.03+]: 依据当前用户区域设置的不区分大小写的排序. 例如, 大多数英语和西欧地区把字母 A-Z 和 ANSI 字母例如 ? 和 ü 等同于它们的小写形式. 这种方法也使用"单词排序", 它把单词中的连字符和撇号例如 "coop" 和 "co-op" 保持在一起. 根据需要排序的项目内容, 它的执行情况比不敏感的默认方法差了 1 到 8 倍.

Dx: 指定 x 作为分隔符, 它决定了 VarName 中每个项目的开始和结束. 如果此选项不存在, x 默认为换行符 (`n), 这样当 VarName 中每行以 LF (`n) 或 CR+LF (`r`n) 结束时可以正确的排序.

F MyFunction [v1.0.47+]: 根据 MyFunction 中的标准进行自定义排序(尽管这样的排序需要更长的时间). 使用字母 "F" 跟着可选的空格/制表符,再跟着 函数 名, 可以对列表中的任意两项进行比较. 此函数必须接受两个或三个参数. 当函数判断出首个参数大于第二个, 它应该返回一个正整数; 当判断出两个参数相等, 应该返回 0, "", 或不返回; 否则, 它应该返回一个负整数. 如果返回值中含有小数点, 这部分被忽略 (例如 0.8 等同于 0). 如果含有第三个参数, 它接受原始/未排序列表中第二个项目相对于第一个的偏移(字符数)(请参看示例). 最后, 此函数使用和脚本相同的全局设置 (例如 StringCaseSense), Sort 命令会调用它的设置.

请注意: F 选项会使得除 D, Z, 和 U 外的其他选项被忽略 (尽管如此 N, C, 和 CL 仍会影响对于 重复项 的检测). 并且, 当指定的函数出现下列情况时不会进行排序: 1) 函数不存在; 2) 接受的参数个数少于两个; 或 3) 首个或第二个参数是 ByRef 类型的.

N: 数字排序: 把每个项目看成数字而不是字符串进行排序 (例如, 如果此选项不存在, 根据字母顺序字符串 233 被认为是小于字符串 40). 十进制和十六进制字符串 (例如 0xF1) 都被认为是数字. 不是以数字开始的字符串在排序中被看成是零. 把数字作为64位浮点值进行处理, 这样可以考虑到小数部分的每位数字(如果有的话).

Pn: 根据第 n 个位置的字符进行排序(n 不能使用十六进制数). 如果此选项不存在, n 默认为 1, 这是首个字符的位置. 在字符串间排序比较时从它们的第 n 个字符开始. 如果 n 大于某个字符串的长度, 在排序中此字符串被看成是空的. 和选项 N (数字排序)一起使用时, 此时使用字符串的字符位置, 它不一定和数字位的位置相同.

R: 逆向排序 (根据其他选项进行字母或数字排序).

Random: 随机排序. 此选项会使得除 D, Z, 和 U 外的其他选项被忽略 (尽管如此 N, C, 和 CL 仍会影响对于重复项的检测). 示例:

    Sort, MyVar, Random
    Sort, MyVar, Random Z D|

U: 移除列表中的重复项使得每个项都是唯一的. ErrorLevel 被设置为移除的项目数 (如果没有则为 0). 如果 C 选项存在, 项目的大小写必须匹配才被看成是等同的. 如果 N 选项存在, 像 2 这个项目将被看成是 2.0 的一个副本. 如果 Pn 或 \ (反斜杠) 选项存在, 整个项目必须相同才看成重复项, 而不仅是用于排序的子字符串. 如果 Random 或 F Function 选项存在, 仅删除排序结果中彼此相邻的重复项(说明:这句中"F Function"在原英文帮助中中间的不是空格而是斜杠,我觉得可能是错误). 例如, 对 "A|B|A" 进行随机排序, 结果中可能包含一个或两个 A.

Z: 要理解此选项, 请考虑内容为 RED`nGREEN`nBLUE`n 的变量. 如果 Z 选项不存在, 最后的换行符 (`n) 被认为是最后那个项目的一部分, 因此变量中只有三个项目. 不过当指定了选项 Z, 最后的 `n (如果存在) 将被认为分隔了列表最后的一个空项目, 因此变量中有四个项目 (最后一个是空的).

\: 根据每个项目中最后的反斜杠后面的子字符串进行排序. 如果项目中不含有反斜杠, 则使用整个项目作为排序的子字符串. 此选项在排序单独的文件名称有用 (即不包含其路径), 例如在下面的例子中, 排序后 AAA.txt 行在 BBB.txt 行的上面, 因为在排序中它们的目录被忽略了:
C:\BBB\AAA.txt
C:\AAA\BBB.txt
请注意: 当反斜杠选项存在时 N 和 P 选项被忽略.

#### 备注

此命令常用于排序包含行列表的变量, 其中的每行以新行符 (`n) 结束. 得到含有行列表的变量的一个方法是使用 FileRead 命令装载整个文件.

如果 VarName 是 Clipboard 并且剪贴板中包含文件 (例如从打开的资源管理器窗口中复制的文件), 这些文件将被它们文件名排序后的列表覆盖. 换句话说, 操作后剪贴板将不再包含文件本身.

仅当 U 选项存在时此命令才会改变 ErrorLevel 的值.

变量所使用的最大内存空间可以通过 #MaxMem 增加.

对一个占用大内存的变量进行排序后当它的内容不再需要时, 您可以清空它来释放占用的内存, 例如 MyVar =

#### 相关

FileRead, file-reading loop, parsing loop, StringSplit, RegisterCallback(), clipboard, #MaxMem

#### 示例

    MyVar = 5,3,7,9,1,13,999,-4
    Sort MyVar, N D,  ; Sort numerically, use comma as delimiter.
    MsgBox %MyVar%   ; The result is -4,1,3,5,7,9,13,999

    ; The following example sorts the contents of a file:
    FileRead, Contents, C:\Address List.txt
    if not ErrorLevel  ; Successfully loaded.
    {
        Sort, Contents
        FileDelete, C:\Address List (alphabetical).txt
        FileAppend, %Contents%, C:\Address List (alphabetical).txt
        Contents =  ; Free the memory.
    }

    ; The following example makes Win+C a hotkey to copy files from an open
    ; Explorer window and put their sorted filenames onto the clipboard:
    cClipboard = ; Must be blank for detection to work.
    Send ^c
    ClipWait 2
    if ErrorLevel
        return
    Sort Clipboard
    MsgBox Ready to be pasted:`n%Clipboard%
    return

    ; The following examples demonstrate custom sorting via a callback function.
    MyVar = def`nabc`nmno`nFGH`nco-op`ncoop`ncop`ncon`n
    Sort, MyVar, F StringSort
    StringSort(a1, a2)
    {
        return a1 > a2 ? 1 : a1 < a2 ? -1 : 0  ; Sorts alphabetically based on the setting of StringCaseSense.
    }

    MyVar = 5,3,7,9,1,13,999,-4
    Sort, MyVar, F IntegerSort D,
    IntegerSort(a1, a2)
    {
        return a1 - a2  ; Sorts in ascending numeric order.  This method works only if the difference is never so large as to overflow a signed 64-bit integer.
    }

    MyVar = 1,2,3,4
    Sort, MyVar, F ReverseDirection D,  ; Reverses the list so that it contains 4,3,2,1
    ReverseDirection(a1, a2, offset)
    {
        return offset  ; Offset is positive if a2 came after a1 in the original list; negative otherwise.
    }