Вам нужно экранировать специальные символы, используя ^
для одних и %
для других.
Для этого, однако, вам нужна только магия setlocal enabledelayedexpansion
@echo off
setlocal enabledelayedexpansion
set /p "pass=password: "
!pass!
В этом случае я ввожу пароль pass|word
, и он будет отображаться passw|word
Я не могу проверить ваш реальный пример, но ваш код должен выглядеть примерно так:
@echo off
setlocal enabledalayedexpansion
Set vAppPoolUser=
Set /p "vAppPoolUser=Enter WebPool user name (domain\username): "
Echo.
set vAppPoolUserPswd=
set "psCommand=powershell -Command "$pword = read-host 'WebPool password' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set "vAppPoolUserPswd=%%p"
Echo !vAppPoolUserPswd!
EDIT
Что касается побега других персонажей, вопрос в комментариях. Как правило, большинство других специальных символов являются дескрипторами enabledelayedexpansion
, но обычно вам необходимо экранировать и !
, а иногда ^
, поэтому после установки переменной:
for /f "usebackq delims=" %%p in (`%psCommand%`) do set "vAppPoolUserPswd=%%p"
set "vAppPoolUserPswd=!vAppPoolUserPswd:^^=^^!"
set "vAppPoolUserPswd=!vAppPoolUserPswd:^^!=^^!!"
echo !vAppPoolUserPswd!
оттуда вам нужно заменить любые %vAppPoolUserPswd%
переменные на !vAppPoolUserPswd!
для delayedexpansion
, чтобы сделать свое дело.