本帖最后由 CrLf 于 2014-9-27 07:54 编辑
常见的排序方式无法自定义排序的依据,像 2>1>3 这样非线性的排序规则就无法实现了,比如这个帖子,有点想法,就写了这个脚本
将下列代码保存为 order.bat 双击可以看演示结果,若保存为 order.js 则可以作为第三方来调用- @set @bathome=1/*&echo off
- (
- for %%a in (
- "中国 12345" "韩国 654321" "新加坡 wwwww" "1234657"
- "abcnnhjhka" "美国 abcd" "日本 00000"
- ) do echo %%~a
- )>text.txt
- ::生成测试样本
-
- cscript -nologo -e:jscript %0 中国 美国 日本 韩国 新加坡 <text.txt
- ::批处理调用示例
-
- pause & eixt /b */
-
- var list=[],
- pattern='.|^$',
- obj={}
-
- var unname = WScript.Arguments.UnNamed
- for(var i=unname.length;i--;){
- obj[unname(i)]=i+1
- pattern = (unname(i).replace(/,/,'\\$&')) + '|' + pattern
- }
- var re = (new RegExp()).compile(pattern,'g')
- //将命令行参数处理为正则表达式,编译为 re 变量
- //并将命令行参数作为对象的属性存储到 obj 对象中
-
- var text = WScript.StdIn.ReadAll().split(/[\r\n]+/g)
- //将每行文本保存在数组中
-
- for(var i in text){
- var array=[]
- var match=text[i].match(re)
- for(var j=0;j<match.length;j++){
- array.push((obj[match[j]]!==undefined)?-obj[match[j]]:match[j])
- }
- text[i] = array
- }
- //对每行进行正则匹配,将命令行参数对应的内容映射为负值,未匹配的内容逐字切分
-
- text = text.sort()
- //根据数组中的数组进行排序
-
- for(var i in text){
- var array=[]
- for(var j in text[i]){
- array.push((-text[i][j]>0)?unname(-1-text[i][j]):text[i][j])
- }
- WScript.Echo(array.join(''))
- }
- //对负值部分映射为对应的命令行参数内容
- //连接数组并输出
复制代码
|