Пакетный файл для цикла удаляет узлы комментариев xml

когда я анализирую xml-файл для обработки в пакетном задании, узлы комментариев кажутся измененными; это как-то связано со специальными символами? как мне это предотвратить.

Такой узел: <!--Location: D:\\Logs--> будет выглядеть так при запросе через %%G: < D:\\Logs-->

Небольшой пример кода:

        **setLocal EnableDelayedExpansion
    for /f "usebackq tokens=* delims= " %%G in ("%HOMEDRIVE%\Logs\Connections.xml") do (

            set str=%%G     

        echo !str!

            PAUSE

    )

endlocal

    **

person kreid    schedule 19.04.2011    source источник
comment
у вас есть только одна проблема, проблема использования неподходящего инструмента для работы.   -  person kurumi    schedule 19.04.2011
comment
и что вы предлагаете?   -  person kreid    schedule 19.04.2011
comment
покажите людям свой входной XML-файл и результат, который вы ожидаете получить, и я покажу вам лучшие способы сделать это, чем пакетный   -  person kurumi    schedule 19.04.2011


Ответы (1)


У тебя три проблемы.

  1. При отложенном расширении он удаляет/обрабатывает ! и вставляет ^ как специальные символы, поскольку ! вычисляется после расширения for-loop-var %%G
  2. Некоторый текст нельзя отобразить с помощью простого echo, например OFF, ON или /?.
  3. Пустые строки удаляются, так как цикл FOR их не обрабатывает.

Чтобы решить 1. вы должны использовать трюк с отложенным переключением. Чтобы решить 2. вы можете использовать форму echo(.

Таким образом, вы получаете

setLocal DisableDelayedExpansion
for /f "usebackq tokens=* delims=" %%G in ("%HOMEDRIVE%\Logs\Connections.xml") do (
    set "str=%%G"
    setLocal EnableDelayedExpansion
    echo(!str!
    endlocal
)

Если вы хотите решить 3. (пустые строки), вы можете использовать findstr /n для нумерации всех строк, чтобы ни одна строка не была пустой, а затем удалить число в цикле.

setLocal DisableDelayedExpansion
for /f "usebackq tokens=* delims=" %%G in (`findstr /n "^" "list.txt"`) do (
    set "str=%%G"
    setLocal EnableDelayedExpansion
    echo(!str:*:=!
    endlocal
)
person jeb    schedule 19.04.2011
comment
Спасибо. Почему Location: удалено тогда? - person kreid; 19.04.2011
comment
@kreid: с включенным отложенным расширением ! оценивается после расширения for-loop-var %%G, поэтому я отключил его перед - person jeb; 19.04.2011
comment
Что такое !str:*:=! делает? - person kreid; 19.04.2011
comment
@kreid !str:*:=! заменяет все до первого : ничем, обычно !str:one=two! заменяет все слова one словом two с префиксом * все до тех пор, пока one не заменяется одним two, см. также set /? - person jeb; 19.04.2011
comment
Разве echo. не является каноническим способом вывода того, что обычно нельзя распечатать? Интересно, однако, что это работает и с (. И ;, = и еще несколько человек. По-видимому, cmd ищет только пробел для работы echo on/echo off, а все остальное, что не мешает разбору команды, можно отключить специальную функцию. - person Joey; 19.04.2011
comment
@Joey: echo. часто упоминается, но это плохое решение, а также ;=, полное объяснение здесь эхо. не удается - person jeb; 20.04.2011
comment
Таким образом, по-видимому, каждая возможность терпит неудачу при определенном вводе. Ура! - person Joey; 20.04.2011
comment
Только echo( кажется стабильным (в настоящее время) - person jeb; 20.04.2011
comment
Если я хочу использовать str после endlocal в цикле for или позже в пакетном файле, как мне это сделать? - person kreid; 20.04.2011
comment
Это можно сделать, но поскольку это другой вопрос, пожалуйста, откройте/задайте новый вопрос - person jeb; 20.04.2011
comment
Спасибо @jeb. Столько знаний в этом ответе! - person carlossierra; 11.03.2017