XPとServer 2003までは、別の付属ツール(VBScript)を使用できます。次の2つのスクリプトで目的の処理を実行できます。
まず、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: "コマンドの効果は、末尾の改行文字なしでプロンプトを出力することです。これ"echo -n"は、bashシェルからコマンドをエミュレートする卑劣な方法 です。これはpasswd、無関係な副作用として空の文字列に設定され、nul:デバイスから入力を取得するため、入力を待機しません。
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"文は最も扱いにくいビットです。Microsoftの "アドバタイズ"なしでVBScriptを実行するため、出力されるのは(VBscriptからの)パスワードだけです"Wscript.StdOut.WriteLine strPassword"。
スペースを含む入力行全体をキャプチャするには、区切り文字を何も設定しないでください。そうしないと、最初の単語しか取得できません。"for ... do set ..."ビットがセットpasswdのVBScriptから実際のパスワード出力します。
次に、空白行をエコーし(行を終了するため"Password: ")passwd、コードの実行後にパスワードを環境変数に含めます。
現在、前述のように、scriptpw.dllXP / 2003までしか使用できません。これを修正するには、scriptpw.dllファイルをWindows\System32XP / 2003システムのフォルダーから自分のシステムのWinnt\System32またはWindows\System32フォルダーにコピーするだけです。DLLがコピーされたら、次を実行してDLLを登録する必要があります。
regsvr32 scriptpw.dll
Vista以降でDLLを正常に登録するには、管理者権限が必要です。私はそのような移動の合法性については調べていません。
(便宜上または法的な理由で)古いDLLファイルを追跡して登録しようとすることに熱心でない場合は、別の方法があります。それ以降のバージョンのWindows(必要なDLL がないバージョン)では、Powershellを使用できます。
そして、実際には、スクリプトを完全に使用できるようにスクリプトをアップグレードすることを検討する必要がありますcmd.exe。ただし、コードの大部分をcmd.exeスクリプトとして保持したい場合(たとえば、変換したくないコードがたくさんある場合など)は、同じトリックを使用できます。
まず、cmdCScriptではなくPowershellを呼び出すようにスクリプトを変更します。
@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自体から。