[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 10# delab-1
在我的win7下,用findstr的话,全是乱码,用find的话,啥都没有。

TOP

回复 12# flashercs


    不懂编程,感觉你说得对。但有些软件就是不按local的来,完全按unicode中的顺序罗列。比如说sublime text等文本编辑软件都是这样,排序后的汉字一看就是unicode的码表中的顺序。

TOP

回复 13# aloha20200628


    谢谢,是那个180M的包中的吗?好东西,我先保存了。
    不过我的是win7,无效。
    估计是 set "lc_all=c" 这个设置在windows或win7以下版本无效吧。这两天搜索资料时见过这个命令,好像是linux下的命令,在windows下只有在cygwin环境下可以设置,设置后linux版的sort命令就可以按拼音排序了。

TOP

回复 13# aloha20200628

目前看,这个运行效果非常好,中文显示完全没有问题,为了方便大家,我把运行程序写在下面:
if exist out_u8.txt del out_u8.txt
copy code2_chksort.txt temp.txt

chcp 65001>nul & set "lc_all=c"
sort76.exe "temp.txt" -r -o "out_u8.txt"
::这个地方注释下,在sort76.exe 下,其输处选项用的是-r (代表倒序) -o是输出文件,这个win自带的sort.exe写法不同,请大家注意。
out_u8.txt

另外论坛自带的sort.exe的下载步骤:
1)进入论坛主界面,在页面最下面的左角有一个“在线第三方下载”
2)点入进入页面以后,在顶部有一个关键词搜索框,在其中输入sort.
3) 就会出现sort版本,点击就可以下载下来了。

再次感谢无私的帮助,再次感谢大家的努力!比较完美的解决了问题

TOP

回复 15# killer3k


    我是用lucida console字体。前面测试过于简单了。
utf-8编码,type可以正常,sort却不能,我也发现某些汉字依然乱码了。正如上面大佬说的。
所以不用纠结了  换个方式吧。

TOP

回复 19# delab-1


    win7没用,估计和操作系统有关。

TOP

回复 20# ppll2030


    死心了死心了。

TOP

本帖最后由 killer3k 于 2024-10-6 20:55 编辑

非常感谢各位!
死心了,准备试试powershell。
不过我不会powershell,vim也才用两三天,几乎可以说还不会。
win7下默认的powershell才是2.0,估计还得升级,这个还得研究一下。

目前只是搞定了在powershell中简单排序的命令,从指定的第几个字符开始排序还没搞定(即相当于sort /+5的方式)。

因为我的目的是在gvim的命令行模式下用命令调用外部程序,所以
get-content asdf.txt |sort-objectl这种方式可能还不行,sort-objectl前面必须是个变量才行。

估计是我的问题太简单了,所以网上也搜不到有用的资料,尽是些怎么在powershell中使用vimr 文章。

唯一有用的是百度AI给出了一条命令,但说实话,百度AI有时候给出的代码根本用不了,所以我也不知道对不对。
:1,10!powershell -Command "& {$_}" | Sort-Object
感叹号及以前不用管,后面符合powershell语法吗?

刚开始学vim,什么都不会,说的也不一定对。
先简单说一下vim调用外部命令的方式,供没用过vim的朋友参考。

:!外部命令表达式

冒号相当于CMD的命令提示符,感叹号表示调用的外部命令。
vim是用打开一个cmd窗口的方式来调用外部命令,

在CMD提示符后显示的是:
cmd.exe /c (外部命令表达式)

说一下我使用成功的例子

:%!sort /+5          # 对当前文本排序
:'<,'>!sort /+5      # 对当前选中文本排序
:1,3!sort /+5        # 对当前文本的1-3行排序

:1,3!powershell -command "get-content asdf.txt | sort-object"
这条命令如果把双引号去掉的话就会出问题,CMD会把|后面的sort-object当成CMD命令来执行。

显示结果:
'sort-object' 不是内部或外部命令,也不是可运行的程序或批处理文件。

上面我抄来的那条命令就更麻烦了。
:1,10w !powershell -Command "& {$_}" | Sort-Object
(为了方便观察试错,所以在1,10后又加了个w,表示不改写文件,这样就只会在CMD窗口中显示。
因为有"、&、|三个特殊符号,在CMD中执行就会有问题,如果原样执行的话,同样是把sort-object当成了CMD命令。

CMD窗口中的命令行显示的是这样的,供参考:
C:\Windows\system32\cmd.exe /c (^(powershell -command ^"^& {$_}^" ^| sort-object^) ^< C:\Users\用户名\AppData\Local\Temp\V51D7f0.tmp)
'sort-object' 不是内部或外部命令,也不是可运行的程序或批处理文件。
shell returned 255
Hit any key to close this window...

V51D7f0.tmp 这个是vim截取1到10行后生成的临时文件,不用管文件名是什么。

如果前后加上双引号的话,
:1,10w !powershell -Command ""& {$_}" | Sort-Object"

运行显示如下:
C:\Windows\system32\cmd.exe /c (^(powershell -command ^"^"^& {$_}^" ^| sort-object^) ^< C:\Users\用户名\AppData\Local\Temp\V51EC03.tmp)
'{$_}" | sort-object' 不是内部或外部命令,也不是可运行的程序或批处理文件。
shell returned 255
Hit any key to close this window...

加了双引号后,就直接把&符号后的{$_}" | sort-object全部当作是CMD命令了。

可以看出来,vim会自动把特殊符号转义后再用cmd.exe来执行,那么问题就是
powershell -Command "& {$_}" | Sort-Object
这条命令我应该怎么写才能让CMD正确执行?
当然,前提是这条powershell命令是正确的,如果这条命令本身就不正确,那么正确的命令应该怎么写?
我想要的是:
powershell -command 获取当前变量 | sort-object

对了,我电脑powshell目前版本还只是2.0,win7好像最高只能升到5.1,所以请提供适用于5.1以下版本的命令。

还有,我想问一下powshell怎样做才能达到 “sort /+5”这样的目的?
最好是一行代码,这样好执行。
网上也找不什么资料,百度AI倒是给出两个参数 -First 和 -Skip,但是百度一会说这是略过的行,一会说这是略过的字符。
我试了一下,比如说 -first 5 是只显示前5行,-skip 5 是不显示前5行。

TOP

本帖最后由 aloha20200628 于 2024-10-5 22:46 编辑

回复 23# killer3k

以下各段代码在cmd窗口命令行直接运行,在 win7/powershell v2 环境下试一试也许也能通过

采用 powershell v3+ 对(ansi 或 gb2312 编码)文本文件 test.txt 中第3个字段按字符值排序
  1. powershell "gc test.txt | sort {$_.split(',')[2]}"
复制代码
采用 powershell v3+ 对(utf-8 编码)文本文件 test.txt 中第3个字段按字符值排序
  1. powershell "gc test.txt -enc utf8 | sort {$_.split(',')[2]}"
复制代码
采用 powershell v3+ 对文本文件(ansi 或 gb2312 编码) test.txt 中第2个字段按整数值排序
  1. powershell "gc test.txt | sort {[int]$_.split(',')[1]}"
复制代码
采用 powershell v3+ 对文本文件(utf-8 编码) test.txt 中第2个字段按整数值排序
  1. powershell "gc test.txt -enc utf8 | sort {[int]$_.split(',')[1]}"
复制代码
测试文件 test.txt 如下
  1. 簡轉繁,9,zyx
  2. 繁轉簡,222,hijk
  3. 采用powershell_v4排序第n列字段,11,ab
复制代码

TOP

回复 19# delab-1


    昨天没成功,今天又试了一下,可以正确显示汉字了(都是复制的相同的代码)。
    不过感觉还是不能解决汉字排序的问题,set LC_ALL="C" 后就没有本地化设置了,汉字就不能按照拼音排序了。
    简单试了一下,功能比CMD的sort强,但我没找到相当于sort /+n参数的功能,速度不如CMD的sort。

TOP

回复 24# aloha20200628


    非常感谢,写了4段代码,真是费心了,而且我感觉你给的这段代码要比百度AI抄来的好。
    感觉split这个东西很有用啊,好像可以用来处理CSV文件。
    对照着看,大致看懂了,也试了一下,win7 powershell2.0下也完全能运行。
    不过,这个split好像必须有分隔符,我试着把分隔符删掉,好像就是把整行当作一个对象。
    我想要的是相当于 sort /+n 的功能,不根据分隔符,而直接从指定的字符位置来开始排序。
    比如说:
    aaaa张三
    bbbb李四
    cccc王五
    dddd赵六
    忽略掉每行的前四个字符,根据每行的第五个字符及之后的文字来排序,这个功能,powershell能不能实现?如果能我就再研究,如果不能我就考虑别的办法。
    以前总觉得powershell太慢,所以不想学,不过现在感觉好像还是可以学一点的。
    再次感谢。

TOP

本帖最后由 killer3k 于 2024-10-6 20:54 编辑

仔细研究了一下,感觉我目前想通过VIM的命令行来调用powershell,达到对文本排序的目的是不可能实现的。问题出在目前我唯一知道的VIM调用外部命令的方式上(可能VIM还有别方法我没接触到)。
VIM是通过把“全文、指定行、选择行”的内容生成一个临时文件,再把这个临时文件传递给外部命令排序,然后再把排序结果覆盖前述指定的内容。
问题就在VIM调用外部命令的方式是:
在VIM命令行输入
:{指定范围} !外部命令表达式
然后用cmd调用这个外部命令表达式,简化一下:
cmd.exe /c (^(外部命令^) ^< 临时文件)
所以,实际上VIM是直接把这个临时文件用重定向符“<”传递给外部命令来处理,而不是把这个临时文件的路径文件名作为参数传递给外部命令。
简单看了一下powershell的帮助,powershell好像不能通过重定向符“<”来接收文件内容。
实际上,CMD中能通过“<”这个重定向符接收文件内容作为输入的命令也是少之又少。
对了,不知道批处理bat文件有没有办法把重定向符“<”之后文件名作为参数传递到批处理文件内,如果行的话,似乎还有点办法。

感觉还是得通过VIM想办法,可能需要写一个VIM脚本,不过我现在连VIM的配置文件在哪都还没找到,慢慢来吧。

TOP

本帖最后由 aloha20200628 于 2024-10-6 21:54 编辑

回复 26# killer3k

比对 sort /+n 的功能,以下代码调用 powershell 对 test.txt 文件每行第3个字符开始排序,在cmd窗口命令行直接运行...
      powershell "gc test.txt | sort {$_[2..$_.length]}"
示例文件 test.txt 内容如下:
a1xa张三
b9bb李四
c5zc王五
d2dd赵六

TOP

回复 26# killer3k


    试试把 sort 后面的分割获取改为字符串获取第4个字符  { $_.Substring(3) } 试试

TOP

回复 23# killer3k


   
看起来vim是重定向输入数据的,ps并不会自动处理,你得自己手动解决,例如下面的
  1. powershell -c "[io.streamreader]::new([console]::OpenStandardInput(),[text.encoding]::utf8).readtoend() -split '\r?\n' |sort"
复制代码
sort /+5这样的功能不自带,你得自己转换,然后处理,例如下面的($l=4中的4就是,从0开始)
  1. powershell -c "$l=4;[io.streamreader]::new([console]::OpenStandardInput(),[text.encoding]::utf8).readtoend() -split '\r?\n' |foreach{if($_.length -gt $l){,@($_.substring($l,$_.length-$l),$_)}else{,@($_,$_)}}|sort {$_[0]} |foreach {$_[1]}"
复制代码
嫌复杂可以将代码放进一个bat里,然后带参数调用这个bat,在bat中只要根据参数执行对应的powershell代码就行了

poswershell中的sort命令排序时会忽略英文减号(-)之类的字符,排序结果可能跟sort.exe的结果不一样

还有poswershell很多东西都跟常规的不一样,除非非常熟悉,不然不建议跟外部程序进行交互,外部程序也不建议跟poswershell进行交互

TOP

返回列表