标题: [文本处理] [已解决]批处理文本替换字符遇到转义字符怎么办? [打印本页]
作者: stance 时间: 2010-11-28 22:37 标题: [已解决]批处理文本替换字符遇到转义字符怎么办?
在改装系统安装盘时想处理一个luna.the文本,改两处:
一是把其中的Wallpaper.MUI=@themeui.dll,-2036一行删除(这个做到了),
二是它上一行“Wallpaper=%WinDir%web\wallpaper\Bliss.bmp” 改成:
“Wallpaper=%WinDir%web\wallpaper\Bliss.jpg”。
问题出在二上了。用批处理语句修改时文本碰到转义字符问题:%WinDir%被识别为c:\windows,输出变成Wallpaper=c:\windows\web\wallpaper\Bliss.bmp,命令无法执行下去。
看了N多DOS帮助,查了不少资料、贴子,都没弄会,请达人指教。最好给个完整的语句,先谢谢啦!
原文本全部内容如下:
; Copyright ?Microsoft Corp. 1995-2001
[Theme]
DisplayName=@themeui.dll,-2017
; My Computer
[CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon]
DefaultValue=%WinDir%explorer.exe,0
; My Documents
[CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\DefaultIcon]
DefaultValue=%WinDir%SYSTEM32\mydocs.dll,0
; My Network Places
[CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}\DefaultIcon]
DefaultValue=%WinDir%SYSTEM32\shell32.dll,17
; Recycle Bin
[CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon]
full=%WinDir%SYSTEM32\shell32.dll,32
empty=%WinDir%SYSTEM32\shell32.dll,31
[Control Panel\Cursors]
Arrow=
Help=
AppStarting=
Wait=
NWPen=
No=
SizeNS=
SizeWE=
Crosshair=
IBeam=
SizeNWSE=
SizeNESW=
SizeAll=
UpArrow=
DefaultValue=Windows default
DefaultValue.MUI=@themeui.dll,-2043
[Control Panel\Desktop]
Wallpaper=%WinDir%web\wallpaper\Bliss.jpg
Wallpaper.MUI=@themeui.dll,-2036
TileWallpaper=0
WallpaperStyle=2
Pattern=
ScreenSaveActive=1
[VisualStyles]
Path=%ResourceDir%\Themes\luna\luna.msstyles
ColorStyle=NormalColor
Size=NormalSize
[boot]
SCRNSAVE.EXE=%WinDir%\System32\logon.scr
[MasterThemeSelector]
MTSM=DABJDKT
ThemeColorBPP=8
Sample Text
[ 本帖最后由 stance 于 2010-11-29 00:58 编辑 ]
作者: hanyeguxing 时间: 2010-11-28 22:50
楼主最好把你的代码贴出来
作者: stance 时间: 2010-11-28 23:05
代码越改越乱,现在是这个样子的,新加了好多%也没用:- for /f "tokens=* delims=" %%i in ('type %DestinationCD%\I386\LUNA.THE.TMP^|findstr /v "Wallpaper.MUI=@themeui.dll,-2036"') do
-
- (
- setlocal enabledelayedexpansion
- set bliss=%%%%Wallpaper=%WinDir%web\wallpaper\Bliss.bmp%%
- for %%j in (%%i) do if %%j==%bliss% set !j=%WinDir%web\wallpaper\Bliss.jpg!&echo %j%>>%DestinationCD%\I386\LUNA.TMP else echo %%j>>%DestinationCD%\I386\LUNA.TMP
- endlocal
- )
复制代码
对字符处理一直很头痛。。。。
作者: hanyeguxing 时间: 2010-11-28 23:16
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%DestinationCD%\I386\LUNA.THE.TMP"') do (
- if "%%b"=="" (echo/) else (
- set b=%%b
- if /i not "!b:~0,14!"=="Wallpaper.MUI=" (
- if /i not "!b:~0,10!"=="Wallpaper=" (echo %%b) else (
- set b=!b:.bmp=.jpg!
- echo !b!
- )))))>"%DestinationCD%\I386\LUNA.TMP"
复制代码
[ 本帖最后由 hanyeguxing 于 2010-11-29 00:00 编辑 ]
作者: stance 时间: 2010-11-28 23:43
谢谢 hanyeguxing!认真拜读了N遍,太受教益了。
应该自己学会才行的,不过,急着用,再对您的代码执行情况提个问题,系统提示:
——系统找不到文件 'findstr /n .* "C:\XP\XP_SP.HotFix\I386\LUNA.THE.TMP"。
仔细查找原因,发现'findstr /n .* "%DestinationCD%\I386\LUNA.THE.TMP"一句缺少右边的 ' 号。加上再试,还是一样。
猜想是不是这一句被批处理当作一个文本字符串对待了?——注意到,即使在语句中加了右 ' ,系统提示中也是有左 ' 没右 ' 的。
——我是在XP SP3环境下测试的。
[ 本帖最后由 stance 于 2010-11-28 23:50 编辑 ]
作者: hanyeguxing 时间: 2010-11-28 23:58
4楼的代码是同时保留空行的,如果不保留,则可以:- @echo off&setlocal enabledelayedexpansion
- (for /f "usebackq eol=寒 delims=" %%b in ("%DestinationCD%\I386\LUNA.THE.TMP") do (
- set b=%%b
- if /i not "!b:~0,14!"=="Wallpaper.MUI=" if /i not "!b:~0,10!"=="Wallpaper=" (echo %%b) else (
- set b=!b:.bmp=.jpg!
- echo !b!
- )))>"%DestinationCD%\I386\LUNA.TMP"
复制代码
[ 本帖最后由 hanyeguxing 于 2010-11-29 00:21 编辑 ]
作者: stance 时间: 2010-11-29 00:11
4楼的代码没有产生LUNA.TMP文件,6楼的产生了。但内容不对,显示如下:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
……
系统没有错误提示,也没有显示执行的过程。正在找原因。。。
[ 本帖最后由 stance 于 2010-11-29 00:16 编辑 ]
作者: hanyeguxing 时间: 2010-11-29 00:23
你对4、6楼的代码重新测试看看
作者: stance 时间: 2010-11-29 00:56
再试,两个都成功了!
非常奇怪,同样的代码,为什么前面的测试都不正确呢?——大概是我的系统环境设置问题吧。
不管怎么说,衷心感谢 hanyeguxing,感谢批处理之家!
代码中还有些不懂的地方,继续学习。
[ 本帖最后由 stance 于 2010-11-29 00:59 编辑 ]
作者: stance 时间: 2010-11-29 19:42
昨天给忘记给hanyeguxing加分了,今天特地来补分,可系统提示说超过24小时的加分限制。
先欠着吧,反正我的权限一次只能评1分。以后把分攒多了时多多给你加。呵呵!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |