Сделать окно cmd поверх других

Я работаю над простым пакетным скриптом, чтобы скрыть пароль, введенный пользователем. Решение состоит в том, чтобы создать всплывающее окно и изменить цвет текста для этого всплывающего окна. Ниже приведен код, и он работает правильно

@echo off
Echo Please enter your password in the popup window and then press enter

set tempbat="%temp%\p.cmd"

REM Create temporary batch file to make popup window for entering password 'masked'
echo mode 20,1 >%tempbat%
echo color 01 >>%tempbat%
echo Title Enter Password >>%tempbat%
echo setlocal enabledelayedexpansion >>%tempbat%
echo set /p Pass= >>%tempbat%
echo echo !pass!^>"%temp%\pass.txt" >>%tempbat%
echo exit >>%tempbat%

start /wait "" %tempbat%
del %tempbat% 2>NUL

set /p Pwd=<"%temp%\pass.txt"
del "%temp%\pass.txt" 2>NUL

echo %Pwd%

Единственное, что меня беспокоит, это то, что когда появляется всплывающее окно, могу ли я установить его всегда поверх главного окна cmd и даже отключить доступ к главному окну cmd (я ожидаю поведения, подобного модальному Bootstrap)?

Спасибо за чтение и надеюсь получить помощь от вас


person Liverpool    schedule 28.10.2014    source источник
comment
Использование всплывающего окна для скрытого пароля может быть бесполезным, но если это то, что вам нужно, вы можете использовать CMDOW. commandline.co.uk/cmdow   -  person John DOE    schedule 28.10.2014
comment
Спасибо за ваше предложение. Но моя работа требует только чистых пакетных сценариев. У меня нет разрешения на использование сторонних скриптов   -  person Liverpool    schedule 29.10.2014


Ответы (1)


Вместо того, чтобы пытаться чем-то скрыть пароль, можно запутать пользовательский ввод в пакетном режиме. См. код MC ND из этого ответа:

@echo off
setlocal enableextensions disabledelayedexpansion

rem Call the subroutine to get the password    
call :getPassword password 

rem Echo what the function returns
if defined password (
    echo You have typed [%password%]
) else (
    echo You have typed nothing
)

rem End of the process    
endlocal
exit /b


rem Subroutine to get the password
:getPassword returnVar
setlocal enableextensions disabledelayedexpansion
set "_password="

rem We need a backspace to handle character removal
for /f %%a in ('"prompt;$H&for %%b in (0) do rem"') do set "BS=%%a"

rem Prompt the user 
set /p "=password ?:" <nul 

:keyLoop
rem retrieve a keypress
set "key="
for /f "delims=" %%a in ('xcopy /l /w "%~f0" "%~f0" 2^>nul') do if not defined key set "key=%%a"
set "key=%key:~-1%"

rem handle the keypress 
rem     if No keypress (enter), then exit
rem     if backspace, remove character from password and console
rem     else add character to password and go ask for next one
if defined key (
    if "%key%"=="%BS%" (
        if defined _password (
            set "_password=%_password:~0,-1%"
            setlocal enabledelayedexpansion & set /p "=!BS! !BS!"<nul & endlocal
        )
    ) else (
        set "_password=%_password%%key%"
        set /p "=*"<nul
    )
    goto :keyLoop
)
echo(
rem return password to caller
if defined _password ( set "exitCode=0" ) else ( set "exitCode=1" )
endlocal & set "%~1=%_password%" & exit /b %exitCode%
person SomethingDark    schedule 29.10.2014
comment
Я только что узнал, что он не работает, если мой пароль включает в себя какой-то специальный символ, например ^ '(). Не могли бы вы помочь? - person Liverpool; 30.10.2014