标题: [文本处理] 【已解决】批处理输入chcp65001后仍然存在中文乱码问题 [打印本页]
作者: pythias 时间: 2024-9-28 20:19 标题: 【已解决】批处理输入chcp65001后仍然存在中文乱码问题
本帖最后由 pythias 于 2024-9-29 14:32 编辑
本代码实现的是计算当前目录下所有cpp后缀文件的总行数- @echo off
- chcp 65001 > nul
- set line=0
-
- dir /b /s | find ".cpp" | find /v /i"cmake" > 1.txt
- for /f "tokens=1* delims=" %%a in (1.txt) do (
- for /f "tokens=1* delims=" %%b in (%%a) do set /a line+=1
- )
- pause
- del 1.txt
- echo %line%
- pause
复制代码
但是在写入1.txt的时候会出现部分字符乱码的情况,并且每次运行时乱码的字符都有些不一样
这是为什么呢?
这就导致第二个for循环到这几行的时候无法正常作为文件路径读取文件
另外一个小问题,报错的前三行文件路径为什么在空格处被分割了呢,明明已经加了"tokens=1* delims="
作者: aloha20200628 时间: 2024-9-28 21:11
回复 1# pythias
用以下代码可直接获取文件名不包含‘cmake’的全部c++文件个数
- dir /b/s/a-d *.cpp | find /v /i /c "cmake"
复制代码
作者: pythias 时间: 2024-9-28 21:23
回复 2# aloha20200628
我想要统计的,是所有cpp文件里面一共写了多少行代码
作者: aloha20200628 时间: 2024-9-28 21:36
本帖最后由 aloha20200628 于 2024-9-28 21:54 编辑
回复 3# pythias - @echo off
- for /f "delims=" %%F in ('dir /b/s/a-d *.cpp^|find /v /i "cmake" ') do (
- for /f %%n in ('find /v /c "" ^<"%%F" ') do set/a n+=%%n
- )
- echo,%n%
- pause&exit/b
复制代码
作者: pythias 时间: 2024-9-28 22:30
回复 4# aloha20200628
很好的思路,学习到了,但是我还是好奇为什么我的写法会出错,中文乱码问题我遇见很多次了
作者: Five66 时间: 2024-9-28 23:35
啊,不是应该会卡在
dir /b /s | find ".cpp" | find /v /i"cmake" > 1.txt
这一行
简体中文系统默认是gbk,如果没有gbk无法表示的字符就不要用chcp 65001
chcp 65001 属于是 it just works,问题多多的
另外吐槽一下,unicode的1200代码页仅适用于托管应用程序
作者: 77七 时间: 2024-9-28 23:39
回复 1# pythias
最后的问题,参考 批处理for语句从入门到精通 4楼末尾
作者: Batcher 时间: 2024-9-29 08:48
回复 1# pythias
另外一个小问题,报错的前三行文件路径为什么在空格处被分割了呢,明明已经加了"tokens=1* delims="
去掉 tokens=1*
只保留 delims=
作者: pythias 时间: 2024-9-29 14:28
回复 6# Five66
感谢解答,将代码改为chcp 936后乱码报错问题解决
作者: pythias 时间: 2024-9-29 14:29
回复 8# Batcher
这个方法不行,根据7楼解答添加usebackq后运行成功,改后代码如下- @echo off
- chcp 936 > nul
- setlocal enabledelayedexpansion
- set line=0
-
- dir /b /s | find ".cpp" | find /v /i"cmake" > 1.txt
- for /f "delims=" %%a in (1.txt) do (
- for /f "usebackq" %%b in ("%%a") do set /a line+=1
- )
- pause
- echo %line%
- pause
复制代码
作者: Batcher 时间: 2024-9-29 16:01
回复 10# pythias
知道你的意思了,两种方法都行:- for /f "usebackq" %%b in ("%%a") do set /a line+=1
复制代码
- for /f "delims=" %%b in ('type "%%a"') do set /a line+=1
复制代码
作者: aloha20200628 时间: 2024-9-29 16:20
本帖最后由 aloha20200628 于 2024-9-29 16:27 编辑
回复 10# pythias
获取文本行总数的两个方法》第一个方法会遗漏空行,第二个方法不会...- ::方法一
- for /f %%a in (1.txt) do set /a n+=1
- ::方法二
- for /f %%n in ('find /c /v ""^<1.txt') do set n=%%n
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |