标题: [文本处理] [已解决]批处理如何控制变量延迟分割文件原样输出特殊字符? [打印本页]
作者: qixiaobin0715 时间: 2020-7-16 11:41 标题: [已解决]批处理如何控制变量延迟分割文件原样输出特殊字符?
自己写的分割文件的批处理如下:- @echo off
- setlocal enabledelayedexpansion
- if not exist Fenge md Fenge
- for /f "delims=" %%a in ('findstr .* abc.txt') do (
- set Var=%%a
- set Var=!Var:*:=!
- if "!Var:~0,1!"=="@" (
- set Name=!Var!
- cd.>"Fenge\!Name!.txt"
- ) else (
- echo,!Var!>>"Fenge\!Name!.txt"
- )
- )
- pause
复制代码
将一个文件分割为多个文件。按行首字符是“@”的行来分割文件,此行作为被分割文件的文件名。
但是如果遇到特殊字符比如“!”,就会被忽略。
abc.txt样式如下:- @副本
- asdf!fff jkhhjj hgjjj
- sfsfsdfgsdg
-
- @无2 3
- asd!ffff&&?
- sfsfsdfgsdg
-
- @123
- asdffff
- sfsfsdfgsdg
-
- @a
- asdffff
- 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,是变量。
如果这样修改上面批处理:- @echo off
- if not exist Fenge md Fenge
- for /f "delims=" %%a in ('findstr .* abc.txt') do (
- set "Var=%%a"
- setlocal enabledelayedexpansion
- set Var=!Var:*:=!
- if "!Var:~0,1!"=="@" (
- set Name=!Var!
- cd.>"Fenge\!Name!.txt"
- ) else (
- echo,!Var!>>"Fenge\!Name!.txt"
- )
- endlocal
- )
- pause
复制代码
第一次循环取得的字符串是”@副本“ 经过if语句判断建立一个文件名为”@副本.txt”(变量为!Name!)的文本文件,退出变量延迟,进入第二次循环;
第二次循环取得的字符串是”asdf!fff jkhhjj hgjjj“ 经过if语句判断进入else语句,将其写入到"Fenge\!Name!.txt"文件中,而!Name!是第一次循环时定义的变量,经过第一次循环endlocal后,在这里就无法识别了。
作者: WHY 时间: 2020-7-16 22:32
- @echo off
- if not exist Fenge md Fenge
- for /f "delims=" %%a in ('findstr /n .* a.txt') do (
- set "Var=%%a"
- setlocal enabledelayedexpansion
- set "Var=!Var:*:=!"
- if "!Var:~0,1!"=="@" (
- for /f "delims=" %%i in ("!Var!") do (
- endlocal
- set "Name=%%i"
- cd.>"Fenge\%%i.txt"
- )
- ) else (
- echo,!Var!>>"Fenge\!Name!.txt"
- endlocal
- )
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2020-7-16 22:43
回复 4# WHY
厉害!!!
作者: qixiaobin0715 时间: 2020-7-21 09:59
本帖最后由 qixiaobin0715 于 2020-7-22 18:50 编辑
回复 4# WHY
受您启发,简化一下代码,去掉中间的for循环:- @echo off
- if not exist Fenge md Fenge
- for /f "delims=" %%a in ('findstr /n .* abc.txt') do (
- set "Var=%%a"
- setlocal enabledelayedexpansion
- set Var=!Var:*:=!
- if "!Var:~0,1!"=="@" (
- endlocal
- set "Name=%%a"
- ) else (
- echo,!Var!>>"Fenge\!Name:*:=!.txt"
- endlocal
- )
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |