找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15654|回复: 11

[文本处理] 【已解决】批处理输入chcp65001后仍然存在中文乱码问题

[复制链接]
发表于 2024-9-28 20:19:35 | 显示全部楼层 |阅读模式
本帖最后由 pythias 于 2024-9-29 14:32 编辑

本代码实现的是计算当前目录下所有cpp后缀文件的总行数
  1. @echo off
  2. chcp 65001 > nul
  3. set line=0

  4. dir /b /s | find ".cpp" | find /v /i"cmake" > 1.txt
  5. for /f "tokens=1* delims=" %%a in (1.txt) do (
  6.         for /f "tokens=1* delims=" %%b in (%%a) do set /a line+=1
  7. )
  8. pause
  9. del 1.txt
  10. echo %line%
  11. pause
复制代码
但是在写入1.txt的时候会出现部分字符乱码的情况,并且每次运行时乱码的字符都有些不一样
这是为什么呢?




这就导致第二个for循环到这几行的时候无法正常作为文件路径读取文件


另外一个小问题,报错的前三行文件路径为什么在空格处被分割了呢,明明已经加了"tokens=1* delims="

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-9-28 21:11:31 | 显示全部楼层
回复 1# pythias

用以下代码可直接获取文件名不包含‘cmake’的全部c++文件个数

  1. dir /b/s/a-d *.cpp | find /v /i /c "cmake"
复制代码
 楼主| 发表于 2024-9-28 21:23:21 | 显示全部楼层
回复 2# aloha20200628


    我想要统计的,是所有cpp文件里面一共写了多少行代码
发表于 2024-9-28 21:36:24 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-9-28 21:54 编辑

回复 3# pythias

  1. @echo off
  2. for /f "delims=" %%F in ('dir /b/s/a-d *.cpp^|find /v /i "cmake" ') do (
  3.         for /f %%n in ('find /v /c "" ^<"%%F" ') do set/a n+=%%n
  4. )
  5. echo,%n%
  6. pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
pythias + 1 乐于助人

查看全部评分

 楼主| 发表于 2024-9-28 22:30:07 | 显示全部楼层
回复 4# aloha20200628


    很好的思路,学习到了,但是我还是好奇为什么我的写法会出错,中文乱码问题我遇见很多次了
发表于 2024-9-28 23:35:29 | 显示全部楼层
啊,不是应该会卡在
dir /b /s | find ".cpp" | find /v /i"cmake" > 1.txt
这一行

简体中文系统默认是gbk,如果没有gbk无法表示的字符就不要用chcp 65001
chcp 65001 属于是 it just works,问题多多的

另外吐槽一下,unicode的1200代码页仅适用于托管应用程序

评分

参与人数 1技术 +1 收起 理由
pythias + 1 感谢分享

查看全部评分

发表于 2024-9-28 23:39:18 | 显示全部楼层
回复 1# pythias



最后的问题,参考 批处理for语句从入门到精通 4楼末尾
发表于 2024-9-29 08:48:04 | 显示全部楼层
回复 1# pythias


另外一个小问题,报错的前三行文件路径为什么在空格处被分割了呢,明明已经加了"tokens=1* delims="

去掉 tokens=1*
只保留 delims=
 楼主| 发表于 2024-9-29 14:28:11 | 显示全部楼层
回复 6# Five66

感谢解答,将代码改为chcp 936后乱码报错问题解决
 楼主| 发表于 2024-9-29 14:29:53 | 显示全部楼层
回复 8# Batcher


    这个方法不行,根据7楼解答添加usebackq后运行成功,改后代码如下
  1. @echo off
  2. chcp 936 > nul
  3. setlocal enabledelayedexpansion
  4. set line=0

  5. dir /b /s | find ".cpp" | find /v /i"cmake" > 1.txt
  6. for /f "delims=" %%a in (1.txt) do (
  7.         for /f "usebackq" %%b in ("%%a") do set /a line+=1
  8. )
  9. pause
  10. echo %line%
  11. pause
复制代码
发表于 2024-9-29 16:01:02 | 显示全部楼层
回复 10# pythias


知道你的意思了,两种方法都行:
  1. for /f "usebackq" %%b in ("%%a") do set /a line+=1
复制代码
  1. for /f "delims=" %%b in ('type "%%a"') do set /a line+=1
复制代码
发表于 2024-9-29 16:20:26 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-9-29 16:27 编辑

回复 10# pythias

获取文本行总数的两个方法》第一个方法会遗漏空行,第二个方法不会...

  1. ::方法一
  2.    for /f %%a in (1.txt) do set /a n+=1
  3. ::方法二
  4.    for /f %%n in ('find /c /v ""^<1.txt') do set n=%%n
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 19:43 , Processed in 0.021323 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表