Проблема с поиском и заменой командного файла - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть файл XML, и у меня есть пакетный файл для поиска определенной строки в этом файле, замените ее на строку, определенную пользователем, а затем выведите ее в новый файл XML:

@echo off > entities_1.xml
setLocal EnableDelayedExpansion

if exist entities_1.xml del entities_1.xml
set /p name= What is the new space NAME?

for /f "tokens=* delims= " %%G in (entities.xml) do (
set str=%%G
set str=!str:[Test Space]=[%name%]!
echo !str! >> entities_1.xml
)

Это работает, и любые экземпляры [Test Space] заменяются значением, определенным пользователем.

Моя проблема, однако, заключается в том, что командный файл также удаляет экземпляры восклицательных (!) Знаков. Так, например, в XML есть строки, подобные этому:

<property name="title"><![CDATA[TEST2]]></property>

Когда запускается пакетный скрипт, он заменяет вышеприведенное на:

<property name="title"><[CDATA[TEST2]]></property>

т.е. раздевание!.

Куда я иду не так? Есть идеи?

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

Это неправильный способ получения строки с помощью set str = %% G , когда включено отложенное расширение.
Это потому, что фаза отложенного расширения идет после фазы расширения %% v.

С отключенным отложенным расширением возникла проблема, состоящая в том, что вы не можете безопасно заменить строку.Таким образом, вы должны включить отложенное расширение.

@echo off > entities_1.xml
setLocal DisableDelayedExpansion

if exist entities_1.xml del entities_1.xml
set /p name= What is the new space NAME?

for /f "tokens=* delims= " %%G in (entities.xml) do (
    set str=%%G
    setLocal EnableDelayedExpansion
    set str=!str:[Test Space]=[%name%]!
    >> entities_1.xml echo(!str!
    endlocal
)

Переключение перенаправления, чтобы вы не добавляли пробел всегда.
Использование echo (, поэтому вы не получаете эхо включено , если! Str! Пуст.

2 голосов
/ 06 декабря 2010

Вам нужно создать пустой файл entities_1.xml, потому что по какой-то непонятной причине >> не создаст его с помощью cmd в качестве оболочки.
Поэтому используйте TYPE NUL > entities_1.xml непосредственно перед циклом FOR, чтобы создатьфайл длиной 0 байт.

0 голосов
/ 06 декабря 2010

проверьте мой ответ на вопрос о той же самой теме, на который ответили отлично.

как заменить строку во второй строке текстового файла с помощью командного файла?

надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...