标题: [文本处理] [已解决]批处理如何修改文本中内容? [打印本页]
作者: pdp320921 时间: 2011-10-31 14:52 标题: [已解决]批处理如何修改文本中内容?
本帖最后由 pdp320921 于 2011-11-2 22:06 编辑
- <?xml version="1.0" encoding="UTF-16"?>
- <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
- <RegistrationInfo>
- <Date>2011-10-28T20:41:25</Date>
- <Author>3-14</Author>
- </RegistrationInfo>
- <Triggers>
- <TimeTrigger>
- <Repetition>
- <Interval>PT2M</Interval>
- <StopAtDurationEnd>false</StopAtDurationEnd>
- </Repetition>
- <StartBoundary>2011-10-28T20:41:00</StartBoundary>
- <Enabled>true</Enabled>
- </TimeTrigger>
- </Triggers>
- <Principals>
- <Principal id="Author">
- <RunLevel>LeastPrivilege</RunLevel>
- <UserId>3-14-PC\3-14</UserId>
- <LogonType>InteractiveToken</LogonType>
- </Principal>
- </Principals>
- <Settings>
- <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
- <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
- <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
- <AllowHardTerminate>true</AllowHardTerminate>
- <StartWhenAvailable>false</StartWhenAvailable>
- <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
- <IdleSettings>
- <StopOnIdleEnd>true</StopOnIdleEnd>
- <RestartOnIdle>false</RestartOnIdle>
- </IdleSettings>
- <AllowStartOnDemand>true</AllowStartOnDemand>
- <Enabled>true</Enabled>
- <Hidden>false</Hidden>
- <RunOnlyIfIdle>false</RunOnlyIfIdle>
- <WakeToRun>false</WakeToRun>
- <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
- <Priority>7</Priority>
- </Settings>
- <Actions Context="Author">
- <Exec>
- <Command>C:\Users\3-14\AppData\Local\Temp\ac.bat</Command>
- </Exec>
- </Actions>
- </Task>
复制代码
文本如上
我想把- <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
- <stopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
复制代码
改成- <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
- <stopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
复制代码
试了几次for没成功,头疼
哪位大侠指点下!
感激!
作者: lvsehuaxue 时间: 2011-10-31 16:25
- @echo off
- for /f "delims=" %%i in (a.txt) do (
- if "%%i" equ " <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>" (
- echo ^<StopIfGoingOnBatteries^>true^</StopIfGoingOnBatteries^>&echo.
- ) else (
- if "%%i" equ " <AllowHardTerminate>true</AllowHardTerminate>" (
- echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>&echo.
- ) else (
- echo %%i&echo.
- )
- )
- )
- pause
复制代码
作者: weichenxiehou 时间: 2011-10-31 18:41
回复 2# lvsehuaxue
这句会死得很惨啊,原文中那么多的"<"和">"。
作者: lvsehuaxue 时间: 2011-10-31 19:13
回复 3# weichenxiehou
我试了,可以的。你亲自试一试不就知道了!
作者: weichenxiehou 时间: 2011-10-31 20:16
回复 4# lvsehuaxue
果然,我武断地以为for在迭代出echo %%i时会把<>认为是重定向符号,原来不会。。。很奇怪,单独执行echo <123>就会出错,看来for/f会自动地过滤掉一些特殊字符。
作者: awk 时间: 2011-10-31 21:58
- sed -e "s#<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>#<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>#" -e "s#<AllowHardTerminate>false</AllowHardTerminate>#<AllowHardTerminate>true</AllowHardTerminate>#" a.txt >b.txt
复制代码
作者: pdp320921 时间: 2011-11-1 09:48
回复 4# lvsehuaxue
我试了还是不可以啊!
作者: Batcher 时间: 2011-11-1 10:11
回复 7# pdp320921
哪里不可以?
作者: awk 时间: 2011-11-1 10:17
- @echo off
- (for /f "delims=" %%i in ('type a.txt') do (
- if "%%i" equ " <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>" (
- echo ^<StopIfGoingOnBatteries^>true^</StopIfGoingOnBatteries^>
- echo,
- ) else (
- if "%%i" equ " <AllowHardTerminate>true</AllowHardTerminate>" (
- echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
- echo,
- ) else (
- echo %%i
- echo,
- )
- )
- ))>b.txt
复制代码
作者: pdp320921 时间: 2011-11-1 12:44
回复 8# Batcher
贴上附件...
其实我是想把a.xml文件
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
中的true换成false
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
源文件是xml格式的,替换还是没成功!
作者: CrLf 时间: 2011-11-1 13:56
回复 5# weichenxiehou
当语块中出现重定向符号时,cmd 在执行语句前的格式化阶段先判断哪些部分是重定向,为类似 >nul 和 <nul 这样的简写补上句柄 1 和 0,标记为重定向命令并后置,举例如下:- for %%a in (t e s t) do dir>%%a.txt /b /a-d /s "%%a"
- ::进入循环后,dir>%%a.txt /b /a-d /s "%%a" 被格式化成 dir /b /a-d /s "%%a" 1>%%a.txt
- ::然后解释 %%a 为 t,再操作句柄。
复制代码
- for %%a in (">test.txt") do dir %%a /b /a-d /s test\
- ::进入循环后,dir %%a /b /a-d /s test\ 被格式化后还是 dir %%a /b /a-d /s test\,因为进行格式化时 %%a 还未被解释成>test.txt,所以 > 尚未生效,也就不被 cmd 认为是重定向语句
- ::然后解释 %%a 为 test.txt,再操作句柄为默认选项 1>con 2>con。
复制代码
作者: Batcher 时间: 2011-11-1 14:04
回复 10# pdp320921
你的xml文件是ANSI编码不?
作者: pdp320921 时间: 2011-11-1 14:07
本帖最后由 pdp320921 于 2011-11-1 14:13 编辑
回复 12# Batcher
,是英文系统里的。
作者: Batcher 时间: 2011-11-1 14:16
回复 13# pdp320921
跟系统语言没有一毛钱关系
你用记事本打开它,选择“另存为”,就可以看到。
作者: pdp320921 时间: 2011-11-1 14:20
回复 14# Batcher
默认是ANSI
还跟编码方式有关?
作者: Batcher 时间: 2011-11-1 14:25
回复 15# pdp320921
你觉得没有?
作者: pdp320921 时间: 2011-11-1 14:28
回复 16# Batcher
我不知道啊,还不知对于我的问题还没解决方法?
作者: pdp320921 时间: 2011-11-1 15:34
回复 16# Batcher
发现一个问题:
当xml是以ANSI编码时无法实现修改文本内容
当xml是以Unicode编码时可以实现修改文本内容
不过如何能通过批处理实现xml文件以Unicode编码?
作者: Batcher 时间: 2011-11-1 16:32
回复 18# pdp320921
你先试试9楼那个type的方法,然后说说具体哪里不行。
作者: pdp320921 时间: 2011-11-1 16:52
回复 19# Batcher
试了,可以输出b.txt但是 没能实现替代仍然是原来值
作者: weichenxiehou 时间: 2011-11-1 19:00
回复 11# CrLf
多谢指教,意思就是说预处理中特殊字符的处理晚于%a%,早于%%a和!a!以及set/a?
因为如下会生成test.txt:- set "test=>test.txt"
- echo,%test%
复制代码
而以下两种情况都只会显示“>test.txt”:- for %%a in (">test.txt") do echo,%%~a
复制代码
- setlocalenabledelayedexpansion
- set "test=>test.txt"
- echo,!test!
复制代码
原来netbenton前辈曾发帖讨论过预处理时变量的替换优先级,%1>%a%>%%a>!a!>set/a,看来这个特殊字符的处理插入到它们之中了。
作者: wc726842270 时间: 2011-11-1 19:04
这类问题LZ为什么不用AWK的方法呢?个人认为还是SED方便,只不过要下载(但是完全值得)
作者: pdp320921 时间: 2011-11-1 19:39
回复 9# awk
还是无法实现替换,真够蛋疼的我
作者: awk 时间: 2011-11-1 22:08
回复 23# pdp320921
把你的xml文件压缩一下传上来,我试试。
作者: pdp320921 时间: 2011-11-2 08:06
回复 24# awk
请帮忙再看看,感激!
作者: awk 时间: 2011-11-2 10:00
回复 25# pdp320921
你的xml文件每行结尾不是普通的CRLF,全部是CRCRLF。- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in ('type a.xml') do (
- set str=%%i
- set str=!str:~0,-1!
- if "!str!" equ " <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>" (
- echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
- ) else if "!str!" equ " <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>" (
- echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
- ) else (
- echo !str!
- )
- ))>b.xml
复制代码
作者: pdp320921 时间: 2011-11-2 10:48
回复 26# awk
非常感谢!
不过还有点小问题
就是结尾</Task> 丢了>
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |