Передача аргументов со специальными символами в пакетный скрипт при включенной задержке расширения - PullRequest
0 голосов
/ 22 апреля 2020

Мне нужно вызвать скрипт, который принимает пароль в качестве одного из аргументов. Когда пароль содержит ,, он рассматривается как разделитель, и пароль будет разделен на два аргумента, а когда он содержит !, все специальные символы опускаются. Я попытался заключить их в ', " и предварительно обработать пароль для экранирования с помощью ^ и ^^. К сожалению, ничего не сработало. Как сохранить эти специальные символы в пароле?

1 Ответ

2 голосов
/ 22 апреля 2020

Вы правы, отложенное расширение должно быть (временно) отключено, чтобы это работало должным образом. ! должен быть экранирован (для отложенной части позже), а остальное заботится об остальном:

@echo off
setlocal enabledelayedexpansion

REM --- get parameter ---
setlocal disabledelayedexpansion
set "x=%~1"
endlocal & set "x=%x:!=^!%"
REM --- end get param ---

set x
echo "!x!"

Вывод:

C:\TEST>test.bat "pass,!<& %|>word"
x=pass,!<& %|>word
"pass,!<& %|>word"

Основным трюком является строка endlocal & set "x=%x:!=^!%". Команда set по-прежнему анализируется без отложенного расширения, но выполняется после endlocal (поскольку вся строка анализируется до выполнения чего-либо - да, странная вещь ...)

...