直到 XP 和 Server 2003,您可以使用另一个包含的工具 (VBScript) - 以下两个脚本可以完成您想要的工作。
首先,getpwd.cmd:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
那么,getpwd.vbs:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
getpwd.vbs 只是使用密码对象从用户那里输入密码,然后将其打印到标准输出(下一段将解释为什么终端不会显示密码)。
getpwd.cmd 命令脚本有点棘手,但它的基本工作原理如下。
"<nul: set /p passwd=Password: " 命令的效果是输出没有尾随换行符的提示 - 这是从 bash shell 模拟 "echo -n" 命令的一种偷偷摸摸的方式。它将passwd 设置为一个空字符串作为不相关的副作用并且不等待输入,因为它从nul: 设备获取输入。
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i" 语句是最棘手的部分。它运行没有微软“广告”的 VBScript,因此唯一的行输出是密码(来自 VBscript "Wscript.StdOut.WriteLine strPassword"。
需要将分隔符设置为空才能捕获带有空格的整个输入行,否则您只会得到第一个单词。 "for ... do set ..." 位将 passwd 设置为 VBScript 输出的实际密码。
然后我们回显一个空行(以终止"Password: " 行),代码运行后密码将在passwd 环境变量中。
现在,如前所述,scriptpw.dll 仅适用于 XP/2003。为了解决这个问题,您可以简单地将 XP/2003 系统的Windows\System32 文件夹中的scriptpw.dll 文件复制到您自己系统上的Winnt\System32 或Windows\System32 文件夹中。复制 DLL 后,您需要通过运行来注册它:
regsvr32 scriptpw.dll
要在 Vista 及更高版本上成功注册 DLL,您需要管理员权限。我还没有检查过这种举动的合法性,所以洞穴讲师。
如果您不是过度热衷于尝试追踪和注册较旧的 DLL 文件(出于方便或法律原因),还有另一种方法。更高版本的 Windows(那些没有所需 DLL 的版本)应该有 Powershell 可供您使用。
事实上,您确实应该考虑升级您的脚本以充分使用它,因为它是一种比cmd.exe 更强大的脚本语言。但是,如果您想将大部分代码保留为 cmd.exe 脚本(例如,如果您有 很多 段不想转换的代码),您可以使用相同的技巧.
首先,修改 cmd 脚本,使其调用 Powershell 而不是 CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
Powershell 脚本同样简单:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
虽然有一些编组来获取实际的密码文本。
请记住,要在您的计算机上运行本地未签名的 Powershell 脚本,您可能需要从(严厉,但非常安全)默认值修改执行策略,例如:
set-executionpolicy remotesigned
来自 Powershell 本身。