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

[文本处理] 【已结帖】BAT如何批量替换丢失原文件的部分主体内容?

本帖最后由 sunson 于 2013-9-4 09:34 编辑

代码如下,批量替换过程中,的确把CHAR1用BWG1替换掉了,但是原文件中的主体部分丢失了,文件大幅减少,不知是什么原因,求解。
示例文件已在附件中。
追加说明:
希望不要借用第三方工具,如SED,因为我这个脚本是提供给别人用的,可能会运行在不通的Windows平台上,有时会遇到SED的兼容问题,而且还要要求安装SED,很不方便,不然我就直接调用Search and Replace了。

最终结论:
经PowerShell版主提示,我进行了测试,在BAT中,ECHO的单行长度≤8185字节,如果超长,该行字符串将无法显示。

附件已无用,故删除。
  1. @ECHO OFF
  2. @ECHO *************************》环境列表定义《***********************
  3. set BWG1=http://10.229.171.51/CNNGateway/any.soap
  4. @ECHO *********************》环境包名及字符串定义《*******************
  5. set CHAR1=REPLACE_THIS_WITH_WEBSERVICE_URL
  6. xcopy *.wsdl test\  /I /Y
  7. cd test
  8. setlocal enabledelayedexpansion
  9. for %%a in (*.wsdl) do (
  10.      (for /f "usebackq delims=" %%b in ("%%a") do  (
  11.           set "str=%%b"
  12.           for %%b in (%CHAR1%-%BWG1%) do (
  13.                for /f "tokens=1,2 delims=-" %%c in ("%%b") do set "str=!str:%%c=%%d!"
  14.           )
  15.           echo !str!
  16.       ))>$
  17. move $ "%%a"
  18. )
  19. cd ..
  20. pause
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

仔细研究了一下,发现是第5行,即主体部分长度很长的原因。
求教,如何在批量替换过程中,解决这种一行内容超长的问题呢?

TOP

  1. sed -i "s#REPLACE_THIS_WITH_WEBSERVICE_URL#http://10.229.171.51/CNNGateway/any.soap#" *.wsdl
复制代码

TOP

回复 3# DAIC

能不能不要借用第三方工具,如SED,因为我这个脚本是提供给别人用的,可能会运行在不通的Windows平台上,有时会遇到SED的兼容问题,而且还要要求安装SED,很不方便。

TOP

回复 4# sunson


    可以考虑把sed.exe一起打包发过去。BAT处理特殊字符非常不方便。

TOP

回复 2# sunson


    你四个for嵌套,里面的%%b有混淆吧?老实说没太明白你的意思。
Still with wax

TOP

回复 6# Lumiere
循环嵌套没有问题,不会混淆。
我就是要把所有的wsdl文件里的CHAR1代表的字符串用BWG1代表的字符串代替,但是在最后进行中间文件替换原文件时,由于wsdl文件的第5行比较特殊(需要是用Ultraedit查看不可见字符),长度很长,不能够返回到原文件中,造成主体内容丢失。
所以这个帖子就是,如何解决批量替换过程中原文件单行长度过长的问题。

TOP

长度超出 8086 范围 估计也就丢失了

TOP

这个长度限制就不能规避么?是echo的限制吗?

TOP

本帖最后由 PowerShell 于 2013-9-3 10:50 编辑

powershell中药能解此癌症,愿意用中药么?
愿意的话,你说出程序详细逻辑,最好负伤例子,我帮你写代码。
powershell winxp-sp3可装,win7以上自带.
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 10# PowerShell

POWERSHELL版主,你是想让我从了吗?
我知道POWERSHELL比BAT强大,不过这样和借用SED是一样的,而且SED也很简单。
难道BAT的先天缺陷,造成了这种超长字符串的问题无法解决吗?

TOP

回复 11# sunson


    试试VBS吧,也许可以。

TOP

本帖最后由 PowerShell 于 2013-9-3 20:18 编辑

难道BAT的先天缺陷,造成了这种超长字符串的问题无法解决吗----是啊,貌似有8000多个的限制啊,他们研究的都知道细节,这是癌症啊,要想解决,1用第三方程序,存字符串,2用其他脚本工具。
bash bat 作为老一代脚本,有很多缺陷,只不过有时候大家藏着掖着,没人专门研究整理喊出来罢了。

bat vbs powershell 长江后浪推前浪啊。
今天你看猪,太低级,只配被吃。几万年后,人人都是超人。人类太落后,必然被淘汰。

你又何必硬让草履虫长翅膀呢?你就从了老衲吧
1

评分人数

    • sunson: 好吧,从了~技术 + 1
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

最终结论:
经PowerShell版主提示,我进行了测试,在BAT中,ECHO的单行长度≤8185字节,如果超长,该行字符串将无法显示。
结贴!

TOP

回复 14# sunson


微软官方有说明的
http://www.bathome.net/viewthread.php?tid=3403#pid21404
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表