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

[文本处理] [已解决]批处理如何控制变量延迟分割文件原样输出特殊字符?

[复制链接]
发表于 2020-7-16 11:41:57 | 显示全部楼层 |阅读模式
自己写的分割文件的批处理如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if not exist Fenge md Fenge
  4. for /f "delims=" %%a in ('findstr .* abc.txt') do (
  5.     set Var=%%a
  6.     set Var=!Var:*:=!
  7.     if "!Var:~0,1!"=="@" (
  8.     set Name=!Var!
  9.       cd.>"Fenge\!Name!.txt"
  10.     ) else (
  11.       echo,!Var!>>"Fenge\!Name!.txt"
  12.     )
  13. )
  14. pause
复制代码
将一个文件分割为多个文件。按行首字符是“@”的行来分割文件,此行作为被分割文件的文件名。
但是如果遇到特殊字符比如“!”,就会被忽略。

abc.txt样式如下:
  1. @副本
  2. asdf!fff   jkhhjj        hgjjj
  3. sfsfsdfgsdg

  4. @无2 3
  5. asd!ffff&&?
  6. sfsfsdfgsdg

  7. @123
  8. asdffff
  9. sfsfsdfgsdg

  10. @a
  11. asdffff
  12. sfsfsdfgsdg

复制代码
运行批处理。上面文本就被分割@副本.txt,@无2 3.txt,@123.txt,@a.txt等4个文件。
但是所有的字符“!”在被分割的文本中消失了。之后也试过在循环内部开通或退出变量延迟,而一旦退出就会引起文件名变量“!Name!” echo关闭,也不行。
不知如何解决。
发表于 2020-7-16 13:05:58 | 显示全部楼层
回复 1# qixiaobin0715


参考:
http://bbs.bathome.net/thread-4580-1-1.html
 楼主| 发表于 2020-7-16 15:25:20 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-7-16 19:32 编辑

回复 2# Batcher

你提到的帖子中文件名是固定的,但这里分割的出来的文件其文件名也是取自源文件abc.txt,是变量。
如果这样修改上面批处理:
  1. @echo off
  2. if not exist Fenge md Fenge
  3. for /f "delims=" %%a in ('findstr .* abc.txt') do (
  4.     set "Var=%%a"
  5.     setlocal enabledelayedexpansion
  6.     set Var=!Var:*:=!
  7.     if "!Var:~0,1!"=="@" (
  8.     set Name=!Var!
  9.       cd.>"Fenge\!Name!.txt"
  10.     ) else (
  11.       echo,!Var!>>"Fenge\!Name!.txt"
  12.     )
  13.     endlocal
  14. )
  15. pause
复制代码
第一次循环取得的字符串是”@副本“  经过if语句判断建立一个文件名为”@副本.txt”(变量为!Name!)的文本文件,退出变量延迟,进入第二次循环;
第二次循环取得的字符串是”asdf!fff   jkhhjj        hgjjj“  经过if语句判断进入else语句,将其写入到"Fenge\!Name!.txt"文件中,而!Name!是第一次循环时定义的变量,经过第一次循环endlocal后,在这里就无法识别了。
发表于 2020-7-16 22:32:41 | 显示全部楼层
  1. @echo off
  2. if not exist Fenge md Fenge
  3. for /f "delims=" %%a in ('findstr /n .* a.txt') do (
  4.     set "Var=%%a"
  5.     setlocal enabledelayedexpansion
  6.     set "Var=!Var:*:=!"
  7.     if "!Var:~0,1!"=="@" (
  8.         for /f "delims=" %%i in ("!Var!") do (
  9.             endlocal
  10.             set "Name=%%i"
  11.             cd.>"Fenge\%%i.txt"
  12.         )
  13.     ) else (
  14.         echo,!Var!>>"Fenge\!Name!.txt"
  15.         endlocal
  16.     )
  17. )
  18. pause
复制代码
 楼主| 发表于 2020-7-16 22:43:11 | 显示全部楼层
回复 4# WHY

   厉害!!!
 楼主| 发表于 2020-7-21 09:59:15 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-7-22 18:50 编辑

回复 4# WHY
受您启发,简化一下代码,去掉中间的for循环:
  1. @echo off
  2. if not exist Fenge md Fenge
  3. for /f "delims=" %%a in ('findstr /n .* abc.txt') do (
  4.     set "Var=%%a"
  5.     setlocal enabledelayedexpansion
  6.     set Var=!Var:*:=!
  7.     if "!Var:~0,1!"=="@" (
  8.     endlocal
  9.     set "Name=%%a"
  10.     ) else (
  11.       echo,!Var!>>"Fenge\!Name:*:=!.txt"
  12.    endlocal
  13.     )
  14. )
  15. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 03:11 , Processed in 0.018840 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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