Board logo

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

作者: qixiaobin0715    时间: 2020-7-16 11:41     标题: [已解决]批处理如何控制变量延迟分割文件原样输出特殊字符?

自己写的分割文件的批处理如下:
  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关闭,也不行。
不知如何解决。
作者: Batcher    时间: 2020-7-16 13:05

回复 1# qixiaobin0715


参考:
http://bbs.bathome.net/thread-4580-1-1.html
作者: qixiaobin0715    时间: 2020-7-16 15:25

本帖最后由 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后,在这里就无法识别了。
作者: WHY    时间: 2020-7-16 22:32

  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
复制代码

作者: qixiaobin0715    时间: 2020-7-16 22:43

回复 4# WHY

   厉害!!!
作者: qixiaobin0715    时间: 2020-7-21 09:59

本帖最后由 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
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2