【问题标题】:Batch Write to Text File with <Angle Brackets>使用 <尖括号> 批量写入文本文件
【发布时间】:2015-03-06 22:32:45
【问题描述】:

我正在尝试使用批处理脚本动态创建一个小型 XML 文件,但在编写以尖括号开头和结尾的行时遇到问题。

1) 如果我这样做:

set foo=^<bar^>
echo %foo% > test.txt

这会导致

> was unexpected at this time.
echo <bar> > test.txt


2) 如果我用引号括住 echo 语句变量:echo "%foo%" &gt; test.txt,它会成功写入文本文件。但是它显然包含了我不能拥有的引号。


3) 然后我就想“嗯,应该就是开头和结尾的尖括号吧……”于是我在尖括号前后加了一个字符:

set foo=a^<bar^>a
echo %foo% > test.txt

这导致了一些奇怪的输出,看起来我的括号被编号了,然后它正在寻找一个文件?

echo a 0<bar 1>test.txt
The system cannot find the file specified.


我以前写过基本的批处理脚本,但我觉得我在这里不知所措......感谢任何帮助!

【问题讨论】:

标签: xml batch-file


【解决方案1】:

我正在尝试使用批处理脚本动态创建一个小的 XML 文件

停止你正在做的事情,放弃它。批处理脚本不是您应该用来创建 XML 的工具,即使您可以长时间使用它以使其在特定情况下工作,它仍然不是创建的正确工具XML 文件。

如果您想要无处不在,无需配置或特殊权限,可在每台 Windows 机器上运行 XML 创建,这可以在 VBScript 中使用实际的 XML API (MSXML2) 完成。

对于普遍存在的、需要一些配置和权限的方法,您可以求助于 PowerShell。

如果您更详细地指定所需的输出,我将提供代码示例。


按照 OP 在 cmets 中的请求,这里是使用 VBScript 的示例性设置。重点当然不是使用哪个工具,而是使用一个对XML有语义理解的工具。

基础 XML 模板,例如project_template.xml:

<project outputDir="" baseDir="" xmlns="http://confuser.codeplex.com">
  <rule pattern="true" preset="maximum" inherit="false" />
</project> 

VBScript 动态填充它,例如project.vbs:

Option Explicit

Const NODE_ELEMENT = 1
Const CONFUSER_NS = "http://confuser.codeplex.com"

Dim doc, moduleElem, args, arg

Set args = WScript.Arguments
Set doc = CreateObject("MSXML2.DOMDocument")

doc.async = False
doc.load "project_template.xml"

If doc.parseError.errorCode Then
  WScript.Echo doc.parseError
  WScript.Quit 1
End If

For Each arg In args.Named
  doc.documentElement.setAttribute arg, args.Named(arg)
Next

For Each arg In args.Unnamed
  Set moduleElem = doc.createNode(NODE_ELEMENT, "module", CONFUSER_NS)
  moduleElem.setAttribute "path", arg
  doc.documentElement.appendChild moduleElem
Next

Doc.save "project.xml"

用法:

cscript /nologo project.vbs /outputDir:"xx1" /baseDir:"xx2" "xx3" "xx4" "xx5"

输出(另存为project.xml

<project outputDir="xx1" baseDir="xx2" xmlns="http://confuser.codeplex.com">
  <rule pattern="true" preset="maximum" inherit="false"/>
  <module path="xx3"/><module path="xx4"/><module path="xx5"/>
</project>

【讨论】:

  • 是的,对线程中唯一合理的帖子投反对票,不要发表评论。好样的。
  • 感谢您的回答,我赞成至少取消反对票:)。我了解您来自哪里,通常我不会尝试以这种方式创建 XML,但就我而言,我认为这将是最合适的解决方案。基本上,我需要动态创建一个基本的“配置”文件,以便我可以运行一个开源混淆器,它只接受配置文件的路径作为命令行参数......所有这些都在构建过程的中间! :P 如果我卡住了,我会重新审视你的答案。
  • 谢谢。我也能理解你来自哪里。只是……使用正确的工具并不困难,所以竭尽全力避免使用它们是不合理的,不是吗?
  • 嗯....如果您不了解该语言,这会有点困难... :P 您能否提供一个小的 vbscript 示例,可以从接受参数的命令行运行并会用它们动态创建一个 XML 文件?我在 MSXML2 上找不到太多...
  • 我可以。如果您确切地举例说明您需要什么,这将对我有所帮助。例如,对我来说最简单的情况:固定基本 XML 结构 Y,由参数 A、B 和 C 更改为最终结果 Z。
【解决方案2】:

试试这个:

setlocal ENABLEDELAYEDEXPANSION

set foo=^<bar^>
echo !foo! > test.txt

endlocal

使用延迟扩展,并将 % 替换为 ! 会导致它以不同的方式评估它。

【讨论】:

    【解决方案3】:

    您需要考虑双重替换:

    set foo=^^^<bar^^^>
    echo %foo% > test.txt
    

    【讨论】:

      【解决方案4】:

      如果您需要使用管道:

      set foo=^^^<bar^^^>
      

      【讨论】:

      • set "foo=^&lt;bar^&gt;" 如果必须的话。这仍然是错误的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多