[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
当批处理执行到“echo 2、加入关卡名称 ...”这一片段,并循环到第48个文件时,字符串会"断节"。
下图截图中提示的“文件名、目录名或卷标语法不正确”,是原来应该被双引号包含的完整文件名,不知道什么原因,后双引号直接把文件名字符串切成两半,从这个后半个引号开始的字符串将以改写模式接在行首(非插入模式),而被切开的后半段文件名就会被覆盖。
以上是我看到的现象,能力有限测试无果,直到7楼大牛点出问题关键,恍然大悟。

步骤1切割得到的90个文件,即使单独使用"2、加入关卡名称 ..."也同样有问题,问题不在第48个文件上,我也测试过在其他位置断节。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. COLOR 1F
  4. set /a N48=0
  5. for /f "delims=" %%a in ('dir /b /on Author\*')do (
  6. set /a N48+=1
  7. echo %%a !N48!
  8. if !N48! GEQ 48 pause
  9. for /f "delims=" %%i in (.\Author\%%a) do (
  10. echo "%%i"===="我会切开第48个文件名字符串"=====
  11. )
  12. )
  13. echo ---------ok-------- & pause
  14. goto:eof
复制代码
---------------------------
最后,说个小问题,楼主给的文件,发现一不规范的标题文件,但这不是问题,改改。
2

评分人数

    • pan528: 认真、细心,领教了。技术 + 1
    • CrLf: 1技术 + 1

TOP

示例文本很多 Title 行结尾不是以 回车换行(\r\n)结尾,而是以 \r\r\n 结尾
开启变量延长扩展后,多余的 \ ...
WHY 发表于 2018-7-10 11:12

感谢7楼大佬的点拨,现在我来对@WHY的回答做点补充。首先我们用Winhex工具打开楼主的文本附件,就能看到了文件最真实的样子:

在ASCII标准码表中,换行符(缩写:LF)对应16进制为0A,转义符/n;回车符\r(缩写:CR)对应16进制为0D,转义符/r。从上图观察我们能明显看到:异常的Tile行末多了个0D即回车符\r,从而确定问题的症结。
检查了楼主的文本,这种问题总共出现在7处位置,分别是#18,#86,#123,#154,#150,#169,#188。
那为何用notepad查看文本,并没有发现异常的Title与其他行有什么区别,也都没有换行?
答:对于windows 下标准文本,它只认"\r\n"为换行,单独"\r"或"\n"就直接忽略。但是在其他编辑器就不一定啦,例如用notepad++就能看到异常的Tile换行了。

知道问题关键了,就要说下解决办法:
方法一:8楼@WHY 的示例代码,这里通过取巧的方法避开"字符串断节"——避免在!m:~7!后再继续添加任何字符(方法不治本),这样就能避免字符串在行首改写。
方法二:规范你的数据文本(不干净的数据真的坑),使用notepad++的查找替换(扩展模式),将"\r\r\n"替换成"\r\n"即可,原批处理命令都不用修改了。
2

评分人数

TOP

回复 12# codegay


    学习了,谢谢

TOP

返回列表