Board logo

标题: [文本处理] [已解决]批处理如何修改文本中内容? [打印本页]

作者: pdp320921    时间: 2011-10-31 14:52     标题: [已解决]批处理如何修改文本中内容?

本帖最后由 pdp320921 于 2011-11-2 22:06 编辑
  1. <?xml version="1.0" encoding="UTF-16"?>
  2. <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  3.   <RegistrationInfo>
  4.     <Date>2011-10-28T20:41:25</Date>
  5.     <Author>3-14</Author>
  6.   </RegistrationInfo>
  7.   <Triggers>
  8.     <TimeTrigger>
  9.       <Repetition>
  10.         <Interval>PT2M</Interval>
  11.         <StopAtDurationEnd>false</StopAtDurationEnd>
  12.       </Repetition>
  13.       <StartBoundary>2011-10-28T20:41:00</StartBoundary>
  14.       <Enabled>true</Enabled>
  15.     </TimeTrigger>
  16.   </Triggers>
  17.   <Principals>
  18.     <Principal id="Author">
  19.       <RunLevel>LeastPrivilege</RunLevel>
  20.       <UserId>3-14-PC\3-14</UserId>
  21.       <LogonType>InteractiveToken</LogonType>
  22.     </Principal>
  23.   </Principals>
  24.   <Settings>
  25.     <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
  26.     <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
  27.     <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
  28.     <AllowHardTerminate>true</AllowHardTerminate>
  29.     <StartWhenAvailable>false</StartWhenAvailable>
  30.     <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
  31.     <IdleSettings>
  32.       <StopOnIdleEnd>true</StopOnIdleEnd>
  33.       <RestartOnIdle>false</RestartOnIdle>
  34.     </IdleSettings>
  35.     <AllowStartOnDemand>true</AllowStartOnDemand>
  36.     <Enabled>true</Enabled>
  37.     <Hidden>false</Hidden>
  38.     <RunOnlyIfIdle>false</RunOnlyIfIdle>
  39.     <WakeToRun>false</WakeToRun>
  40.     <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
  41.     <Priority>7</Priority>
  42.   </Settings>
  43.   <Actions Context="Author">
  44.     <Exec>
  45.       <Command>C:\Users\3-14\AppData\Local\Temp\ac.bat</Command>
  46.     </Exec>
  47.   </Actions>
  48. </Task>
复制代码
文本如上

我想把
  1.    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
  2.        <stopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
复制代码
改成
  1.       <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
  2.   <stopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
复制代码
试了几次for没成功,头疼

哪位大侠指点下!
感激!
作者: lvsehuaxue    时间: 2011-10-31 16:25

  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do (
  3.    if "%%i" equ "    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>" (
  4.       echo     ^<StopIfGoingOnBatteries^>true^</StopIfGoingOnBatteries^>&echo.
  5.       ) else (
  6.       if "%%i" equ "    <AllowHardTerminate>true</AllowHardTerminate>" (
  7.             echo     ^<AllowHardTerminate^>true^</AllowHardTerminate^>&echo.
  8.             ) else (
  9.             echo %%i&echo.
  10.             )
  11.    )
  12. )
  13. pause
复制代码

作者: weichenxiehou    时间: 2011-10-31 18:41

回复 2# lvsehuaxue
echo %%i&echo.
这句会死得很惨啊,原文中那么多的"<"和">"。
作者: 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

  1. 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

  1. @echo off
  2. (for /f "delims=" %%i in ('type a.txt') do (
  3.     if "%%i" equ "    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>" (
  4.         echo     ^<StopIfGoingOnBatteries^>true^</StopIfGoingOnBatteries^>
  5.         echo,
  6.     ) else (
  7.         if "%%i" equ "    <AllowHardTerminate>true</AllowHardTerminate>" (
  8.             echo     ^<AllowHardTerminate^>true^</AllowHardTerminate^>
  9.             echo,
  10.         ) else (
  11.             echo %%i
  12.             echo,
  13.         )
  14.    )
  15. ))>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,标记为重定向命令并后置,举例如下:
  1. for %%a in (t e s t) do dir>%%a.txt /b /a-d /s "%%a"
  2. ::进入循环后,dir>%%a.txt /b /a-d /s "%%a" 被格式化成 dir /b /a-d /s "%%a" 1>%%a.txt
  3. ::然后解释 %%a 为 t,再操作句柄。
复制代码
  1. for %%a in (">test.txt") do dir %%a /b /a-d /s test\
  2. ::进入循环后,dir %%a /b /a-d /s test\ 被格式化后还是 dir %%a /b /a-d /s test\,因为进行格式化时 %%a 还未被解释成>test.txt,所以 > 尚未生效,也就不被 cmd 认为是重定向语句
  3. ::然后解释 %%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:
  1. set "test=>test.txt"
  2. echo,%test%
复制代码
而以下两种情况都只会显示“>test.txt”:
  1. for %%a in (">test.txt") do echo,%%~a
复制代码
  1. setlocalenabledelayedexpansion
  2. set "test=>test.txt"
  3. 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。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in ('type a.xml') do (
  4.     set str=%%i
  5.     set str=!str:~0,-1!
  6.     if "!str!" equ "    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>" (
  7.         echo     ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
  8.     ) else if "!str!" equ "    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>" (
  9.         echo     ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
  10.     ) else (
  11.         echo !str!
  12.     )
  13. ))>b.xml
复制代码

作者: pdp320921    时间: 2011-11-2 10:48

回复 26# awk


    非常感谢!
不过还有点小问题
就是结尾</Task> 丢了>




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2