HTML的input type="password"对应的Windows批处理代码是什么?
在Windows中,HTML的等效的Windows批处理命令是什么?
问题的出现原因:在Windows中,没有直接的批处理命令可以实现类似HTML的的密码输入功能。因此,需要使用其他方法来实现这个功能。
解决方法:通过使用在Windows上免费提供的另一个工具,可以实现密码输入功能。以下是两个脚本的示例:
首先,GetPwd.cmd:
@echo off
:: GetPwd.cmd - 获取密码,不回显。
for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i echo. :: 这部分只是为了证明我们已经获取了密码。 echo %passwd% 然后,GetPwd.vbs:
' GetPwd.vbs - 获取密码,不回显,并输出。 Set oScriptPW = CreateObject("ScriptPW.Password") strPassword = oScriptPW.GetPassword() Wscript.StdOut.WriteLine strPassword
GetPwd.vbs脚本使用密码对象从用户输入密码,并将其打印到标准输出(下一段将解释为什么不会显示在终端上)。
GetPwd.cmd脚本稍微复杂一些(但通常命令脚本都是如此)。
"
这个命令只是输出提示,没有尾随的CR/LF - 这是模仿bash的"echo -n"的一种巧妙方式。它将passwd设置为空字符串作为副作用,并且不等待输入,因为它的输入来自nul:设备。
"for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i"
这个语句是最棘手的部分。它以无Microsoft广告的方式运行vbscript(/nologo),所以唯一的输出行是密码(来自vbscript的"Wscript.StdOut.WriteLine strPassword")。
将分隔符设置为空是为了捕获带有空格的输入行,否则只会得到第一个单词。"for ... do set ..."将passwd设置为vbscript输出的实际密码。
然后我们输出一个空行(实际上是结束"Password: "行),并输出密码以验证它是否起作用:
C:\Pax> GetPwd
Password:
this is my password
C:\Pax>
这个脚本pw.dll在XP和2K3中可用,但不一定适用于以后的版本。
以下是Vista和可能的Win7的说明,请尝试一下:
为了隐藏密码,该脚本利用了ScriptPW COM对象。ScriptPW在Windows XP和Windows 2003上默认加载。如果您正在运行Windows 2000或Windows Vista,您需要从XP系统或Windows 2003系统的Windows\System32文件夹中复制scriptpw.dll文件到您的Windows 2000或Vista系统的Winnt\System32或Windows\System32文件夹。复制DLL后,您需要通过运行以下命令来注册它:
regsvr32 scriptpw.dll
要在Vista机器上成功注册DLL,您需要以管理员身份打开命令提示符。要做到这一点,点击开始|所有程序|附件。然后右键单击命令提示符快捷方式,选择“以管理员身份运行”。进入以管理员身份的命令提示符后,您将能够成功运行regsvr32 scriptpw.dll命令来注册DLL。
文章整理完毕。
在Windows批处理中,如果想要实现类似HTML中的input type="password"的效果,可以使用以下方法:
首先,可以创建一个Visual Basic Script(VBS)来处理密码输入。以下是一个示例的批处理代码:
@echo off & setlocal enableextensions
:: 构建一个Visual Basic Script
set vbs_=%temp%\tmp$$$.vbs
set skip=
findstr "'%skip%VBS" "%~f0" > "%vbs_%"
::
:: 不换行提示,与第15条类似
echo.|set /p="Password: "
:: 使用Microsoft Windows Script Host Version 5.6运行脚本
for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass1=%%a
::
::echo.
echo.|set /p="Retype : "
for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass2=%%a
::
:: 清理
for %%f in ("%vbs_%") do if exist %%f del %%f
::
:: 显示结果
echo.
if "%MyPass1%"=="%MyPass2%" (
echo The entered password was %MyPass1%
) else (
echo No match)
endlocal & goto :EOF
'
'The Visual Basic Script
Set WshPass = WScript.CreateObject("ScriptPW.Password") 'VBS
Password=WshPass.GetPassWord() 'VBS
WScript.Echo PassWord 'VBS
上述代码通过调用Visual Basic Script(VBS)来实现密码输入。用户输入密码时,将不会显示在屏幕上。最后,将比较两次输入的密码,并输出结果。
然而,由于"ScriptPW.Password"对象在Windows Vista、Windows 7和Windows Server 2008中不被支持,因此可以使用一个小的C#控制台应用程序来替代。可以在以下链接中找到相关的C#代码:http://blog.magerquark.de/scriptpw-dll-on-windows-2008-and-windows-7-scriptpw-password/。
以上就是在Windows批处理中实现类似HTML中input type="password"的方法。
1. 问题出现的原因是HTML中的标签在Windows批处理中没有直接的等效方法。
解决方法是使用纯批处理解决方案或使用HTA弹出窗口的密码提交器。
在纯批处理解决方案中,可以使用XCOPY命令和其/P /L开关来模拟隐藏的密码输入。具体代码如下:
:: Hidden.cmd
::Tom Lavedas, 02/05/2013, 02/20/2013
::Carlos, 02/22/2013
::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI
Off
:HInput
SetLocal EnableExtensions EnableDelayedExpansion
Set "FILE=%Temp%.\T"
Set "FILE=.\T"
Keys List >"%File%"
Set /P "=Hidden text ending with Ctrl-C?: " <Nul
Echo.
Set "HInput="
:HInput_
For /F "tokens=1* delims=?" %%A In (
'"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"'
) Do (
Set "Text=%%B"
If Defined Text (
Set "Char=!Text:~1,1!"
Set "Intro=1"
For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
Rem If press Intro
If 1 Equ !Intro! Goto :HInput#
Set "HInput=!HInput!!Char!"
)
)
Goto :HInput_
:HInput#
Echo(!HInput!
Goto :Eof
在使用HTA弹出窗口的密码提交器中,需要保存为.bat文件,代码如下:
function pipePass() {
var pass=document.getElementById('pass').value;
var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
close(fso.Write(pass));
}
另外,还可以使用编译的.NET混合解决方案。这个解决方案需要保存为.bat文件,它会创建/编译一个小的.exe文件,然后调用它来获取密码。代码如下:
()==() /* JScript comment
off
setlocal
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
set "jsc=%%v"
)
if not exist "%~n0.exe" (
"%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)
for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
set "pass=%%p"
)
echo your password is %pass%
endlocal & exit /b %errorlevel%
*/
import System;
var pwd = "";
var key;
Console.Error.Write("Enter password: ");
do {
key = Console.ReadKey(true);
if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
pwd=pwd+(key.KeyChar.ToString());
Console.Error.Write("*");
}
} while (key.Key != ConsoleKey.Enter);
Console.Error.WriteLine();
Console.WriteLine(pwd);
以上就是解决Windows批处理中输入类型为password的等效方法的几种解决方案。