Как использовать специальные символы в powerShellScript

Поэтому я пытаюсь использовать приведенный ниже скрипт, динамически помещая разные значения в файл свойств. Но 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Удалите 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:!=^!%]" - но, как и в случае с экранированием от буквального использования !, необходимо выбрать количество экземпляров ^ для экранирования в зависимости от того, находится ли ссылка внутри "..." или нет, неудобно - и, по сути, выбор динамического расширения с помощью !...! позволяет избежать этой проблемы.

Итак, это должно выглядеть так: @echo off rem. Установите путь к файлу свойств, заданный «PROPERTIES_FILE=src\main\resources\config.properties».

Razvan Calina 10.03.2024 22:10

@RazvanCalina: Нет, вам все равно нужно setlocal, чтобы не влиять на состояние глобального сеанса. Другими словами: замените строку setlocal enabledelayedexpansion просто на setlocal — я обновил ответ, чтобы сделать это более понятным.

mklement0 10.03.2024 22:29

Большое спасибо, я работал над этим около 12 часов и не мог заставить это работать, это невероятно!!!

Razvan Calina 10.03.2024 23:19

@RazvanCalina: Это не повлияет на решение в вашем случае, но посмотрите мой обновленный ответ, который добавляет некоторые нюансы.

mklement0 11.03.2024 00:04

Другие вопросы по теме