Скрыть пароль, введенный в консоли - Пакетный скрипт - PullRequest
1 голос
/ 26 марта 2019

Команда Powershell, используемая в файле BAT, удаляет управляющий символ, доступный в пароле, указанном пользователем в консоли, и сохраняет его в файле.

У меня есть сценарий BAT, который предлагает пользователю указать парольв консоли.Пароль должен быть замаскирован как *****, когда пользователь вводит его в консоли.Пароль будет что-то вроде wel! 123.Этот пароль сохраняется в переменной и, наконец, копируется в текстовый файл.Я получил несколько предложений использовать приведенный ниже код в моем BAT-файле, но экранирующий символ в фактическом пароле (Wel! 123) удаляется и сохраняется пароль как Wel123 в файле login.txt.

SetLocal
set "psCmd=powershell -Command "$pwd = read-host 'Enter Your Password' - 
AsSecureString; $BSTR= 
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd); 
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /F "usebackq delims=" %%# in (`%psCmd%`) do set "pwd=%%#"

@echo %pwd%>>login.txt

Ответы [ 2 ]

1 голос
/ 26 марта 2019

! исчезающие символы не имеет отношения к PowerShell - это предполагает, что опция cmd.exe enabledelayedexpansion действует , в этом случае ! служитразделитель имени переменной - и в этом случае изолированные ! символов.просто отбрасывается .

В качестве отступления: !, следовательно, не является escape символом.

Вы поэтомунеобходимо:

  • Отключить расширение переменной с задержкой с помощью setLocal disabledelayedexpansion:

    • Обратите внимание, что расширение с задержкой выключено по умолчанию, поэтому что-то в вашей среде должно быть включено.
  • Кроме того, как указывает Squashman , ^ символов - cmd.exe Чарсв строках без кавычек - будет "съедено", поэтому вы должны экранировать все ^ символов.как ^^, что можно сделать с помощью %pwd:^=^^%.

Чтобы сложить все вместе:

@echo off
setLocal disabledelayedexpansion

set "psCmd=powershell -Command "$pwd = read-host 'Enter Your Password' -AsSecureString; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""

for /F "usebackq delims=" %%# in (`%psCmd%`) do set "pwd=%%#"

echo %pwd:^=^^%>>login.txt
1 голос
/ 26 марта 2019

Чтобы преобразовать это в PowerShell, вы уже написали большую часть кода:

$pwd = Read-Host 'Enter Your Password' -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) | Add-Content -Path login.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...