Мы пытаемся преобразовать скрипт оболочки bash в пакетный скрипт Windows. Мы поставляем эти скрипты вместе с нашим программным продуктом, и мы не можем предполагать, что у клиента будет или будет возможность загрузить sed / awk / cygwin или любые другие нестандартные инструменты. Таким образом, сценарий должен работать с любыми инструментами, входящими в комплект поставки Windows. Минимальная целевая платформа - Windows XP SP2. Этот скрипт вызывается из другого пакетного скрипта.
Одна часть скрипта должна найти в файле определенную строку и изменить ее. В bash это легко. Подход, который мы используем в пакетном скрипте Windows, заключается в том, чтобы построчно просматривать файл. Если строка не содержит целевой строки, мы выводим ее во временный файл как есть. Если строка содержит целевую строку, мы выводим жестко закодированную строку во временный файл.
Проблема в том, что некоторые строки входного файла содержат знаки «меньше» и «больше». Если мы поместим кавычки вокруг строк, они будут записаны без изменений во временный файл, но заключены в кавычки.
"-- this is a comment in the output .sql file"
"SELECT foo FROM bar WHERE something < 10;"
"--<SpecialInternalTagComment>"
Если мы заключим их в кавычки, используя% ~ 1, то CMD.EXE попытается обработать символы <и> как символы перенаправления и выдает ошибки, когда скрипт встречает одну из этих строк, потому что получающаяся команда будет выглядеть примерно так: 1008 *
echo --<SpecialInternalTagComment> >> temp.file
Вот что мы имеем сейчас. Он создает содержимое файла с каждой строкой, заключенной в кавычки.
:clean_install
echo New installation >> %INSTALL_LOG%
echo > %INSTALL_FOLDER%"\sql\oracle\table_maintenance_tmp.sql
for /f "usebackq tokens=* delims=" %%A in (table_maintenance.sql) do (
call :replace_width_and_write_line "%%A"
)
goto done
:replace_width_and_write_line
echo %1 | find "&&TARGET_STRING" > NUL
if %ERRORLEVEL% == 0 (
echo TABLE_PARTITION_WIDTH CONSTANT NUMBER := 7 ; >> %INSTALL_FOLDER%"\sql\oracle\table_maintenance_tmp.sql
goto :eof
)
echo %1 >> %INSTALL_FOLDER%"\sql\oracle\table_maintenance_tmp.sql
goto :eof
Вопрос в том, как мы можем отобразить содержимое строки в файл без кавычек, если строка содержит символы перенаправления? Если это не может быть сделано, то есть другой способ достичь нашей первоначальной цели, которая состоит в том, чтобы взять в качестве входных данных файл, который может содержать или не содержать определенную целевую строку, и создать в качестве выходного файла файл, идентичный исходному файл, за исключением того, что если эта целевая строка существует, она заменяется новой строкой?
Я искал здесь на stackoverflow, и два наиболее полезных вопроса:
* Как вы удаляете кавычки из строки ECHO в пакетном файле Windows?
* Работа с кавычками в пакетных сценариях Windows
Примечание: Пожалуйста, не предлагайте Cygwin, sed, awk, Perl, Python, Ruby, unx или любые другие технологии, которые не поставляются с Windows XP из коробки. Эти ответы будут отклонены.
Спасибо
shoover