[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创代码] order.js 按指定顺序排序

本帖最后由 CrLf 于 2014-9-27 07:54 编辑

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

返回列表