如何更换&与&在批处理文件中?

时间:2014-05-31 11:58:39

标签: batch-file

[编辑]添加完整示例以显示确切问题[/ EDIT]

我正在清理一些日志文件,因此我可以将它们转换为XML,除了日志文件中的一些非XML兼容字符外,一切正常。

因此,我试图取代&与& .amp; (删除点),但不知何故,这似乎是一个问题。

这是我的蝙蝠档案:

@echo off & setLocal enableDELAYedexpansion

set "find=&"
set "replace=&"

findstr /v "string1 string2" test.log > tmp_test.log
> test.xml (
  echo ^<rows^>
  for /f "tokens=5" %%A in (tmp_test.log) do (
  set string=%%A
  call set string=%%string:!find!=!replace!%%
  echo ^<r a="!string!"/^>
  )
  echo ^</rows^>
)
del tmp_test.log
endlocal

这是一个简化的日志文件,基本思路是获取第5个令牌(URI)删除一些冗余的(包含string1或string2),替换XML不兼容的字符并将其保存为XML文件。

2014-03-27 00:00:12 123.45.67.890 GET /good_url.html?something=one&something_else=four - 8080
2014-03-27 00:00:12 123.45.67.890 GET /good_url.html - 8080
2014-03-27 00:00:12 123.45.67.890 GET /string2.html - 8080
2014-03-27 00:00:13 123.45.67.890 GET /string1.html - 8080
2014-03-27 00:00:13 123.45.67.890 GET /some_uri_with_html/%2e%2e%2f%2eini - 8080

这是输出:

<rows>
<r a="/good_url.html?something=one&something_else=four"/>
<r a="/good_url.html"/>
<r a="/some_uri_with_html/%2e%2e%2f%2eini"/>
</rows>

所以,除了Ampersand之外都很好,它似乎在这个过程中的某个地方从实体转换为单个char。

换句话说,我需要得到

<r a="/good_url.html?something=one&amp;something_else=four"/>

有什么建议吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

@echo off & setLocal enableDELAYedexpansion

set "find=&"
set "replace=&amp;"

> test.xml (
   echo ^<rows^>
   for /f "tokens=5" %%A in ('findstr /v "string1 string2" test.log') do (
      set "string=%%A"
      set "string=!string:%find%=%replace%!"
      echo ^<r a="!string!"/^>
   )
   echo ^</rows^>
)

输出:

<rows>
<r a="/good_url.html?something=one&amp;something_else=four"/>
<r a="/good_url.html"/>
<r a="/some_uri_with_html/%2e%2e%2f%2eini"/>
</rows>

答案 1 :(得分:0)

如果您对&使用此语法,则不需要转义set

set "var=value"

以下是改编的代码:

setlocal enabledelayedexpansion
set "find=&"
set "replace=&.amp;"
for %%A in ("Hello & World") do (
  set string=%%~A
  call set "string=%%string:!find!=!replace!%%"
  echo ^<r a="!string!"/^>
)