Проблемы с выходом из пакетного файла - PullRequest
0 голосов
/ 25 марта 2019

Я написал командный файл для изменения атрибута XML-файла.Сценарий работает и атрибут изменен, однако у меня возникает проблема с экранированием некоторых символов.

Я испробовал каждое решение, которое могу найти в Интернете, но безуспешно.

Мое предназначениевывод:

<xs:import schemaLocation="2e9dd7db-f58b-4c91-8575-3b3af05d3178.xsd" namespace="urn:verastar:veracore:types" />

Однако я получаю:

<xs:import schemaLocation="="2e9dd7db-f58b-4c91-8575-3b3af05d3178.xsd"" namespace="urn:verastar:veracore:types

Я пытался экранировать кавычки с помощью ^, это работает при использовании echo для консоли, однако не делает;не работает при записи в файл.

Почему я получаю ="=", также я получаю двойные кавычки, но когда я удаляю одно, в файл ничего не записывается ... и, наконец, последняя кавычка кажетсявсе портится, и поэтому в выводе отсутствует закрывающий тег XML.

Как правильно экранировать эти символы?

Мой код:

@echo on
setlocal EnableExtensions DisableDelayedExpansion

rem check if the XSD to modify exists in the batch directory
set "XSDFile=%~dp0test.xsd"

if not exist "%XSDFile%" goto EndBatch

rem environment variables
set "LineNumber="
set "LineCount=0"
set "TmpFile=%TEMP%\%~n0.tmp"

rem Search for the line containing attribute schemaLocation and get its
rem line number and the line itself loaded into environment variables

for /F "tokens=1* delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /L /N /C:schemaLocation= "%XSDFile%" 2^>nul') do (
    set "LineNumber=%%I"
    set "FileLine=%%J"
)

rem If no line with attribute schemaLocation found, exit this batch file
if not defined LineNumber goto EndBatch

setlocal EnableDelayedExpansion
set "FileName=!FileLine:*schemaLocation=!"

for /f "tokens=1 delims=?" %%a in ("%FileName%") do (set test=%%a)

set "test=<xs:import schemaLocation="%test%.xsd"" namespace="urn:verastar:veracore:types" />"

pause

endlocal & set "FileLine=%test% 

rem Make sure the temporary file used next does not already exist.
del "%TmpFile%" 2>nul

rem Copy all lines from XML file to a temporary file including empty
rem lines with the exception of the line containing attribute schemaLocation
rem which is copied to temporary file with the modified schemaLocation.
for /F "tokens=1* delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /R /N "^" "%XSDFile%" 2^>nul') do (
    set "XmlLine=%%J"
    set /A LineCount+=1
    setlocal EnableDelayedExpansion
    if not !LineCount! == %LineNumber% (
        echo/!XmlLine!>>"%TmpFile%"
    ) else (
        echo/!FileLine!>>"%TmpFile%"
    )
    endlocal
)

rem Overwrite original file with temporary file automatically deleted on success.
move /Y "%TmpFile%" "%XSDFile%" >nul

:EndBatch
endlocal
...