使用 <Angle Brackets> 批量写入文本文件
Batch Write to Text File with <Angle Brackets>
我正在尝试使用批处理脚本动态创建一个小 XML 文件,但在编写以尖括号开头和结尾的行时遇到问题。
1) 如果我这样做:
set foo=^<bar^>
echo %foo% > test.txt
这导致
> was unexpected at this time.
echo <bar> > test.txt
2) 如果我用引号将 echo 语句变量括起来:echo "%foo%" > test.txt
,它会成功写入文本文件。但是它显然包含了我没有的引号。
3)然后想到"Well, it must just be the angle brackets at the beginning and end..."于是在尖括号前后加了一个字符:
set foo=a^<bar^>a
echo %foo% > test.txt
这导致了一些奇怪的输出,看起来我的括号正在编号,然后它正在寻找文件?
echo a 0<bar 1>test.txt
The system cannot find the file specified.
我以前写过基本的批处理脚本,但感觉我在这里不知所措...感谢任何帮助!
如果使用管道,您需要:
set foo=^^^<bar^^^>
您需要考虑双重替换:
set foo=^^^<bar^^^>
echo %foo% > test.txt
试试这个:
setlocal ENABLEDELAYEDEXPANSION
set foo=^<bar^>
echo !foo! > test.txt
endlocal
使用延迟扩展,并将 %
替换为 !
会导致其计算不同。
I am attempting to dynamically create a small XML file with a Batch Script
停止你正在做的事情,废弃它。批处理脚本不是您应该用来创建 XML 的工具,即使您可以长时间使用它以使其在特定情况下工作,它 仍然 不是不是创建 XML 文件的正确工具。
如果你想要无处不在,不需要配置或特殊权限,在每台 Windows 机器上运行 XML 创建,这可以在 VBScript 中完成,使用实际的 XML API (MSXML2).
对于普遍存在的、需要一些配置和权限的方法,您可以转向 PowerShell。
如果您更详细地指定所需的输出,我将提供代码示例。
按照 OP 在评论中的要求,这里是一个使用 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 文件,但在编写以尖括号开头和结尾的行时遇到问题。
1) 如果我这样做:
set foo=^<bar^>
echo %foo% > test.txt
这导致
> was unexpected at this time.
echo <bar> > test.txt
2) 如果我用引号将 echo 语句变量括起来:echo "%foo%" > test.txt
,它会成功写入文本文件。但是它显然包含了我没有的引号。
3)然后想到"Well, it must just be the angle brackets at the beginning and end..."于是在尖括号前后加了一个字符:
set foo=a^<bar^>a
echo %foo% > test.txt
这导致了一些奇怪的输出,看起来我的括号正在编号,然后它正在寻找文件?
echo a 0<bar 1>test.txt
The system cannot find the file specified.
我以前写过基本的批处理脚本,但感觉我在这里不知所措...感谢任何帮助!
如果使用管道,您需要:
set foo=^^^<bar^^^>
您需要考虑双重替换:
set foo=^^^<bar^^^>
echo %foo% > test.txt
试试这个:
setlocal ENABLEDELAYEDEXPANSION
set foo=^<bar^>
echo !foo! > test.txt
endlocal
使用延迟扩展,并将 %
替换为 !
会导致其计算不同。
I am attempting to dynamically create a small XML file with a Batch Script
停止你正在做的事情,废弃它。批处理脚本不是您应该用来创建 XML 的工具,即使您可以长时间使用它以使其在特定情况下工作,它 仍然 不是不是创建 XML 文件的正确工具。
如果你想要无处不在,不需要配置或特殊权限,在每台 Windows 机器上运行 XML 创建,这可以在 VBScript 中完成,使用实际的 XML API (MSXML2).
对于普遍存在的、需要一些配置和权限的方法,您可以转向 PowerShell。
如果您更详细地指定所需的输出,我将提供代码示例。
按照 OP 在评论中的要求,这里是一个使用 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>