Пакетная запись в текстовый файл с <угловыми скобками>

Я пытаюсь динамически создать небольшой XML-файл с помощью пакетного сценария, но у меня возникают проблемы с написанием строк, которые начинаются и заканчиваются угловыми скобками.

1) Если я сделаю что-то вроде:

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

Это приводит к

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


2) Если я окружу переменную статического эха кавычками: echo "%foo%" > 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.


Я уже писал элементарные пакетные сценарии, но чувствую, что у меня над головой... Любая помощь приветствуется!

4 ответа

Решение

Попробуй это:

setlocal ENABLEDELAYEDEXPANSION

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

endlocal

Использование отложенного расширения и замена % с ! заставляет это оценивать это по-другому.

Если вы используете трубу, вам нужно:

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

Вам необходимо учитывать двойную замену:

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

Я пытаюсь динамически создать небольшой файл XML с помощью пакетного скрипта

Прекрати то, что ты делаешь, отбрось это. Пакетный скрипт не является инструментом, который вы должны использовать для создания 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>
Другие вопросы по тегам