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

[文本处理] 批处理字串取代出现了程式码

各位版友大家好,我想请教一下字串取代的问题。
我在做字串取代时,取代的字串会变成下一行程式码的内容,请问为什麽会这样呢?
/G05.1 Q1本来应该空白,但变成了.M09=.
  1. @echo off
  2. (for /f "tokens=1* delims=:" %%i in ('findstr /n .* %1') do (
  3.     set "line=%%j"
  4.     setlocal enabledelayedexpansion
  5.     if "!line!"=="" (echo.!line!) else (
  6.     set "line=!line:/G05.1 Q1=!"
  7.     set "line=!line:.M09=.!"
  8.     set "line=!line:/G05.1 Q0=!"
  9.     echo.!line!
  10.     endlocal
  11. )))>back.txt
复制代码
以下是%1的内容
  1. %
  2. O0100
  3. (SC POSTPROCESSOR A.I.C TAICHUNG)
  4. G40G49G90G80
  5. G17G00G54X0.Y0.
  6. /G05.1 Q1
  7. (TOOL: *4.0)
  8. M03S2000
  9. G43Z50.H1
  10. M8
  11. G98G81X-12.Y0.Z-1.R1.F60.M09
  12. X12.S2000M03
  13. G80Z50.
  14. /G05.1 Q0
  15. M09
  16. G00Z50.
  17. X0.Y0.
  18. M05
  19. M30
  20. %
复制代码
执行後会变成第六行有问题
  1. %
  2. O0100
  3. (SC POSTPROCESSOR A.I.C TAICHUNG)
  4. G40G49G90G80
  5. G17G00G54X0.Y0.
  6. .M09=.
  7. (TOOL: *4.0)
  8. M03S2000
  9. G43Z50.H1
  10. M8
  11. G98G81X-12.Y0.Z-1.R1.F60.
  12. X12.S2000M03
  13. G80Z50.
  14. M09
  15. G00Z50.
  16. X0.Y0.
  17. M05
  18. M30
  19. %
复制代码
而我想要的是
  1. %
  2. O0100
  3. (SC POSTPROCESSOR A.I.C TAICHUNG)
  4. G40G49G90G80
  5. G17G00G54X0.Y0.
  6. (TOOL: *4.0)
  7. M03S2000
  8. G43Z50.H1
  9. M8
  10. G98G81X-12.Y0.Z-1.R1.F60.
  11. X12.S2000M03
  12. G80Z50.
  13. M09
  14. G00Z50.
  15. X0.Y0.
  16. M05
  17. M30
  18. %
复制代码

本帖最后由 CrLf 于 2012-7-19 11:51 编辑

因为第六行执行了 set "line=!line:/G05.1 Q1=!" 之后,变量 line 为空。
如果是我可能会这样解决:
set "line=%%j" 改成  set "line=#%%j"
echo.!line! 改成 echo.!line:~1!

顺便说下,echo. 会触发文件搜索,所以效率相对比较低,建议使用 echo: 代替,具有最好的效率和最强的兼容性

TOP

感谢版大的回答,我在%%j前面多加了#,
原本该消失的就消失了,
但每行最前面都多了一个#。

TOP

回复 3# Topgunguy


    2楼不是还有一句与 set 对应的针对 echo 的修改吗?

TOP

本帖最后由 Topgunguy 于 2012-7-17 22:33 编辑

感谢版大,我看懂了。
後来我发现
set "line=!line:/G05.1 Q1=!"   改成
set "line=!line:/G05.1 Q1= !"  似乎也可以不为空

我想另外再请教一下,取代字串一定要像这样一行一行写进去吗?
档案超过300kb时会非常久,而整个文本会改到的最多也不过十行啊>_<

不知有没有其他直接取代的指令
感谢~

TOP

本帖最后由 CrLf 于 2012-7-18 11:32 编辑

回复 5# Topgunguy


    纯批可以考虑如此简化:
  1. @echo off
  2. (for /f "delims="eol^= %%a in ('findstr /x /v /r /c:"/G05.1 Q[01]" "%~1"') do (
  3.    if "%%a"==".M09=." (echo .=.) else echo\%%a
  4. ))>bak.txt
复制代码
若能使用第三方,sed 则更快更方便:
  1. sed "/^G05.1 Q[01]$/d;s/^M09/./" "%~1">bak.txt
复制代码
vbs 效率应该也不错:
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Set ts = FSO.OpenTextFile(WScript.Arguments(0),1)
  3. str = ts.ReadAll
  4. ts.Close
  5. str = Replace(str,"G05.1 Q0","")
  6. str = Replace(str,"G05.1 Q1","")
  7. str = Replace(str,"M09",".")
  8. Set ts = FSO.CreateTextFile(bak.txt,True)
  9. ts.Write str
  10. ts.Close
复制代码

TOP

感谢Cr大的解答,
有一个很重要的问题我一直想问,
一开始我直觉这应该很基本,爬文google一下也许马上就会知道,
於是就一直没问,断断续续自已找答案,
但两个月过去後,我错了,我还是不知道。
我应该马上就问才对Orz。

请问VBS版的代码要怎麽使用?

保存成 .vbs 後直接点两下,会显示
行3 字元5 阵列索引超出范围
(大写S↑)
如果是将档案放到 .vbs上放开,则显示
行11 字元5 此处须要物件bak
(大写S↑)

难道还要用VB编译吗?
感谢~

TOP

返回列表