[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批量替换字符的批处理, 提示出错.

就是批量替换文件中的指定字符, 但是运行后会提示 "系统找不到指定的文件", 不是是何原因.
  1. echo.&echo.&echo.&echo.&echo.&echo.
  2. echo.&set /p T3= Please type in file format what you want:
  3. echo.&set /p T1= Please type in the characters that want to be replaced:
  4. echo.&set /p T2= Please type in the new characters:
  5. setlocal enabledelayedexpansion
  6. for /f "tokens=*" %%i in ('dir /a /b *.%T3%') do (
  7.     set "var=%%i"
  8.     if not !var!.==. (
  9. rem
  10.     for /f "tokens=*" %%j in (!var!) do (
  11.         set "tmp=%%j"
  12.         if not !tmp!.==. (
  13.           set "tmp=!tmp:%T1%=%T2%!"
  14.           rem
  15.           echo !tmp!>>temp.txt
  16.         )
  17.     )
  18.     rem
  19.     move temp.txt !var!
  20.     )
  21. )
  22. echo.&echo.&echo.&echo.&echo Good, it is finished.
  23. pause
复制代码

回复 1# xinghua_wei
  1. @echo off
  2. set /p "T3=Please type in file format what you want:"
  3. set /p "T1=Please type in the characters that want to be replaced:"
  4. set /p "T2=Please type in the new characters:"
  5. setlocal enabledelayedexpansion
  6. for /f "tokens=*" %%i in ('dir /b /a-d *.%T3%') do (
  7.     set "var=%%i"
  8.     if not !var!.==. (
  9.         (for /f "tokens=*" %%j in ('type "!var!"') do (
  10.             set "tmp=%%j"
  11.             if not !tmp!.==. (
  12.                 set "tmp=!tmp:%T1%=%T2%!"
  13.                 echo,!tmp!
  14.             )
  15.         ))>"%temp%\stage.txt"
  16.         move "%temp%\stage.txt" "!var!"
  17.     )
  18. )
  19. pause
复制代码
测试代码之前请做好备份

TOP

回复 2# ShowCode


   经测试OK, 非常感谢!!!!

TOP

回复 1# xinghua_wei
感觉代码第9、13行的判断语句是多余的。如果能进入循环体,变量就不会为空;如果压根不会进入循环体,就不会触及循环体中的命令。
所以要么代码不会进入到循环体内,就触及不到判断语句;要么代码进入循环体,判断语句的结果永远为真,加不加判断没有什么区别。

TOP

本帖最后由 77七 于 2024-7-22 23:21 编辑

回复 4# qixiaobin0715


   大佬,我在考虑 这个帖子的问题(http://bbs.bathome.net/redirect.php?goto=findpost&;ptid=69399&pid=282496),发现使用tokens=*,值为空也进入循环了,省略或使用tokens=1,不进入循环。
  1. @echo off
  2. for /f %%a in (" ") do echo 1[%%a]
  3. for /f "tokens=*" %%a in (" ") do echo 2[%%a]
  4. pause
复制代码
bat小白,请多指教!谢谢!

TOP

这可能是cmd预处理机制(实际上我也完全不懂)所决定的,杜撰一下吧,不管对错总是便于理解的。
tokens的参数*表示取字符串所有内容,数字表示只取特定的列:
1.当参数为*号时,首先会判断整个字符串是否为空值,为空就不会进入循环,否则就会进入循环。在上述例子中,整个字符串是空格,不为空,所以会进入循环,只是分隔符默认为空格和跳格,所以最前面的空格和跳格在循环中不会显示,即为空值,这是比较特殊的情况。如果整个字符串是“aaa”,“delims=a”,也是一样(未测试,想当然耳);
2.参数为数值时,会先按分隔符,生成多列,然后判断特定列是否存在,若是则进入循环,若否则忽略。

TOP

本帖最后由 qixiaobin0715 于 2024-7-23 10:41 编辑

总感觉4楼和6楼的说法是相互矛盾的。
想来也不矛盾,文件名好像不会出现这种情况。

TOP

返回列表