标题: [文本处理] 批量替换字符的批处理, 提示出错. [打印本页]
作者: xinghua_wei 时间: 2024-7-15 21:20 标题: 批量替换字符的批处理, 提示出错.
就是批量替换文件中的指定字符, 但是运行后会提示 "系统找不到指定的文件", 不是是何原因.- echo.&echo.&echo.&echo.&echo.&echo.
- echo.&set /p T3= Please type in file format what you want:
- echo.&set /p T1= Please type in the characters that want to be replaced:
- echo.&set /p T2= Please type in the new characters:
- setlocal enabledelayedexpansion
-
- for /f "tokens=*" %%i in ('dir /a /b *.%T3%') do (
- set "var=%%i"
- if not !var!.==. (
- rem
- for /f "tokens=*" %%j in (!var!) do (
- set "tmp=%%j"
- if not !tmp!.==. (
- set "tmp=!tmp:%T1%=%T2%!"
- rem
- echo !tmp!>>temp.txt
- )
- )
- rem
- move temp.txt !var!
- )
- )
-
- echo.&echo.&echo.&echo.&echo Good, it is finished.
- pause
复制代码
作者: ShowCode 时间: 2024-7-15 21:45
回复 1# xinghua_wei - @echo off
- set /p "T3=Please type in file format what you want:"
- set /p "T1=Please type in the characters that want to be replaced:"
- set /p "T2=Please type in the new characters:"
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in ('dir /b /a-d *.%T3%') do (
- set "var=%%i"
- if not !var!.==. (
- (for /f "tokens=*" %%j in ('type "!var!"') do (
- set "tmp=%%j"
- if not !tmp!.==. (
- set "tmp=!tmp:%T1%=%T2%!"
- echo,!tmp!
- )
- ))>"%temp%\stage.txt"
- move "%temp%\stage.txt" "!var!"
- )
- )
- pause
复制代码
作者: xinghua_wei 时间: 2024-7-15 21:52
回复 2# ShowCode
经测试OK, 非常感谢!!!!
作者: qixiaobin0715 时间: 2024-7-16 16:58
回复 1# xinghua_wei
感觉代码第9、13行的判断语句是多余的。如果能进入循环体,变量就不会为空;如果压根不会进入循环体,就不会触及循环体中的命令。
所以要么代码不会进入到循环体内,就触及不到判断语句;要么代码进入循环体,判断语句的结果永远为真,加不加判断没有什么区别。
作者: 77七 时间: 2024-7-22 23:18
本帖最后由 77七 于 2024-7-22 23:21 编辑
回复 4# qixiaobin0715
大佬,我在考虑 这个帖子的问题(http://bbs.bathome.net/redirect.php?goto=findpost&;ptid=69399&pid=282496),发现使用tokens=*,值为空也进入循环了,省略或使用tokens=1,不进入循环。- @echo off
- for /f %%a in (" ") do echo 1[%%a]
- for /f "tokens=*" %%a in (" ") do echo 2[%%a]
- pause
复制代码
作者: qixiaobin0715 时间: 2024-7-23 08:49
这可能是cmd预处理机制(实际上我也完全不懂)所决定的,杜撰一下吧,不管对错总是便于理解的。
tokens的参数*表示取字符串所有内容,数字表示只取特定的列:
1.当参数为*号时,首先会判断整个字符串是否为空值,为空就不会进入循环,否则就会进入循环。在上述例子中,整个字符串是空格,不为空,所以会进入循环,只是分隔符默认为空格和跳格,所以最前面的空格和跳格在循环中不会显示,即为空值,这是比较特殊的情况。如果整个字符串是“aaa”,“delims=a”,也是一样(未测试,想当然耳);
2.参数为数值时,会先按分隔符,生成多列,然后判断特定列是否存在,若是则进入循环,若否则忽略。
作者: qixiaobin0715 时间: 2024-7-23 10:38
本帖最后由 qixiaobin0715 于 2024-7-23 10:41 编辑
总感觉4楼和6楼的说法是相互矛盾的。
想来也不矛盾,文件名好像不会出现这种情况。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |