Поэтому я пытаюсь использовать приведенный ниже скрипт, динамически помещая разные значения в файл свойств. Но powershell не позволит мне использовать специальные символы, такие как !
@echo off
setlocal enabledelayedexpansion
rem Set the properties file path
set "PROPERTIES_FILE=src\main\resources\config.properties"
rem Replace placeholders with Jenkins parameters in the properties file
powershell -Command "(Get-Content '%PROPERTIES_FILE%') | ForEach-Object { $_ -replace 'USERNAME=(.*)', 'USERNAME=%Username%' } | Set-Content '%PROPERTIES_FILE%'"
powershell -Command "(Get-Content '%PROPERTIES_FILE%') | ForEach-Object { $_ -replace 'PASSWORD=(.*)', ('PASSWORD=' + [regex]::escape('%Password%')) } | Set-Content '%PROPERTIES_FILE%'"
rem Optionally, print the updated file contents for verification
type "%PROPERTIES_FILE%"
rem Execute your Maven command
mvn clean test -Dtest=ScriptTest
Я пытаюсь использовать параметры Jenkins для обновления файла config.properties.





Удалите enabledelayedexpansion из вашего оператора setlocal.
setlocal enabledelayedexpansion просто на setlocal.enabledelayedexpansion — это то, что «съедает» символы ! — даже те, которые присутствуют в значениях статических переменных, таких как %Password%.
enabledelayedexpansion необходим только в том случае, если вам не нужно динамическое расширение переменных, заключая ссылки на переменные в !...!, например. !Password!, в отличие от статического макроподобного расширения, которое выполняют обычные ссылки на переменные %...%.
Хотя функция enabledelayedexpansion иногда необходима, например. для итеративного создания значения переменной в операторе for/f проблематично интерпретировать любую ! как часть ссылки на динамическую переменную в буквальном использовании и в расширениях %...% и спокойно удалять ее, если это не так, - если только используется явное экранирование.
Следующее содержимое пакетного файла демонстрирует эту проблему:
@echo off & setlocal enableDelayedExpansion
:: This "!" will be "eaten"
echo [hi!]
echo --
:: In literal use, you can *escape* "!", using "^"
:: Note that - awkwardly - whether you need *one or two* "^" depends
:: on whether the argument is inside "..." or not.
echo [hi^^!]
echo "[hi^!]"
echo --
:: In %...% variable references, stand-alone "!" are also "eaten",
:: but via !...! they are preserved.
:: Due to `enabledelayedexpansion`, this assigns verbatim "hi!"
set "FOO=hi^!"
echo [%FOO%]
echo [!FOO!]
Приведенное выше выводит следующее, доказывая, что автономный ! «съедается» (тихо удаляется) как в (неэкранированном) буквальном использовании, так и в расширениях переменных %...%:
[hi]
--
[hi!]
"[hi!]"
--
[hi]
[hi!]
Примечание:
Ссылки на переменные — как статические, так и динамические — допускают технику подстановки (замены подстроки): например,set FOO=BAR_NONE, за которым следует echo %FOO:_=-% или echo !FOO:_=-! (с действующим enabledelayedexpansion), результатом будет BAR-NONE.
В принципе, вы можете использовать это и в ссылках на переменные %...%, чтобы внедрить необходимое экранирование перед динамической интерпретацией из-за срабатывания enabledelayedexpansion - например, echo [%FOO:!=^^!%] или echo "[%FOO:!=^!%]" - но, как и в случае с экранированием от буквального использования !, необходимо выбрать количество экземпляров ^ для экранирования в зависимости от того, находится ли ссылка внутри "..." или нет, неудобно - и, по сути, выбор динамического расширения с помощью !...! позволяет избежать этой проблемы.
@RazvanCalina: Нет, вам все равно нужно setlocal, чтобы не влиять на состояние глобального сеанса. Другими словами: замените строку setlocal enabledelayedexpansion просто на setlocal — я обновил ответ, чтобы сделать это более понятным.
Большое спасибо, я работал над этим около 12 часов и не мог заставить это работать, это невероятно!!!
@RazvanCalina: Это не повлияет на решение в вашем случае, но посмотрите мой обновленный ответ, который добавляет некоторые нюансы.
Итак, это должно выглядеть так: @echo off rem. Установите путь к файлу свойств, заданный «PROPERTIES_FILE=src\main\resources\config.properties».