我做了一个批量游戏,用户可以登录/注册。但如果站在附近的人可以偷看密码,那么密码是没有意义的。普通密码字段用星号(*)掩盖字符。
如何在批处理文件中屏蔽字符?
我之前在cmd上看过这个,但我不知道怎么做。
答案 0 :(得分:13)
您可以使用XCOPY
作为隐藏输入,它可以处理几乎所有字符,还可以实现退格逻辑。
@echo off
setlocal EnableDelayedExpansion
call :input
echo(
echo '!input!'
if "!input!"=="password" echo OK
exit /b
:input
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do (
set "\b=%%a"
)
set "input="
:keyLoop
call :GetKey
if not defined key exit /b
if "!key!"=="!\b!" (
if defined input (
set "input=!input:~0,-1!"
<nul set /p ".=!\b! !\b!"
)
) ELSE (
<nul set /p ".=*"
set "input=!input!!key!"
)
goto :keyLoop
:GetKey
setlocal DisableDelayedExpansion
set "key="
for /F "usebackq delims=" %%L in (`xcopy /L /w "%~f0" "%~f0" 2^>NUL`) do (
if not defined key set "key=%%L"
)
(
endlocal
set "key=^%key:~-1%" !
exit /b
)
此代码应该能够处理所有字符,例如^!&%<>
也可以使用退格键删除最后输入的字符。
行set "key=^%key:~-1%" !
似乎很奇怪,但它用于在延迟扩展上下文中使用!
转义set "key=^!" !
字符。
为避免所有其他字符出现问题,最后!
删除了插入符号,就像在set "key=^A" !
中一样,将被评估为“set”键= A“`
答案 1 :(得分:2)
好的,这与你可能想到的有点不同,但是你选择游戏开发批处理是错的。
我看到的方式是你有3个选择:
choice
命令连续输入一个键输入并等待用户命中空格以表示密码的结束
现在,当我打字时,一个想法就是如何实现这个目标。由于可能需要一些时间来测试我认为我会发布这个想法(因为它似乎是这个问题的解决方案,已经存在了一段时间)。
set /p
将所有输入存储到变量中,完成后将通过使用waitfor
或简单的目录文件与另一个批处理线程进行通信。pause >nul
语句,并计算pause
语句循环的次数,打印出适当数量的*
。该线程的另一个重要工作是感知用户何时完成输入密码的输入。我现在开始制作这个批处理程序,但是现在我只是告诉你我的想法到目前为止。
@echo off
Title Password Please:
:: This is the main code
REM This code relies on Masker.bat
REM SET password to be first and thrid letter,
REM of the day of the week.
set pass=%Date:~0,1%%Date:~2,1%
REM START Masker in the same window using /b tag and create hold.pass:
Echo 0 >%temp%\hold.pass
start /b Masker.bat "%pass%" *
REM Simply take input an leave the rest to Masker.bat
set /p pass_input=:
Echo 1 >>%temp%\hold.pass
cls
if /i "%pass%" NEQ "%pass_input%" (
Title Worng Password
Echo Wrong Password... Sorry.
Sleep 5
Exit
)
Pause > nul
REM Rest of Main game code is below or simply
:: START Main.bat & Exit
@echo off
Title Password Please:
setlocal enabledelayedexpansion
:: This is not the main code
REM This code is called upon by Login.bat (or the Main.bat game code)
REM CREATE the variables "passlen" and "mask":
set password=%~1
set passlen=0
:miniloop
set /a passlen+=1
if "!password:~%passlen%,1!" NEQ "" goto :miniloop
set password=
set mask=%~2
if "%mask%" EQU "" set mask=*
REM MAIN loop
:loop
cls
for /l %%a in (1,1,%passlen%) do (<nul set /p=%mask%)
sleep -m 150
for /f "usebackq" %%a in ("%temp%\hold.pass") do (if "%%~a" EQU "1" Del %temp%\hold.pass & Exit)
goto :loop
它仍然需要一些改进,但是我花了30分钟就完成了它并没有成功地让它动态地告诉你输入了多少个字符。
任何人都会把这个拿走,作为我的客人。其他一切都很好
莫纳
答案 2 :(得分:0)
输入密码后无需输入即可正常工作。 如果输入正确的密码,好的。 如果您输入了错误的密码,当您输入第9个字符(可以调整)时它将停止。 它并不关心资本化。 问题:密码在代码中以纯文本形式存储
@echo off
setlocal enabledelayedexpansion
set "s= abcdefghijklmnopqrstuvwxyz"
set p=
:loop
choice /C %s% /N >nul
set p=%p%!s:~%errorlevel%,1!&set /p =*<nul
if /i "%p%"=="secured" goto :right
if not "%p:~8,1%"=="" goto :wrong
goto :loop
goto :wrong
:right
echo you entered correct password: %p%
goto :eof
:wrong
echo you entered wrong password: %p%
goto :eof
答案 3 :(得分:0)
您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取8个字符的密码,在屏幕上显示星号,并自动继续,无需按Enter键:
call :ReadFormattedLine password="********" /M "Enter password (8 chars): "
这个子程序是用纯批处理编写的,因此它不需要任何额外的程序,它允许几个格式化的输入操作,如只读数字,将字母转换为大写等。您可以从Read a line with specific format下载ReadFormattedLine子程序