1. ホーム
  2. batch-file

[解決済み] batファイルの入力テキストをマスクすることはできますか?

2022-12-25 23:57:56

質問

他のプログラムを実行するためのバッチファイルを書いています。この場合、パスワードを要求する必要があります。入力テキストをマスクする方法はありますか? 入力文字の代わりに******文字を表示する必要はありません。Linuxのパスワードプロンプトの動作(入力中は何も表示しない)で十分です。

@echo off
SET /P variable=Password : 
echo %variable%
Pause

これで入力は読み込まれますが、この方法ではテキストをマスクすることができません。

どのように解決するのですか?

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.dll は XP/2003 までしか使用できません。これを修正するために、単に scriptpw.dll ファイルを Windows\System32 フォルダを、XP/2003 システムの Winnt\System32 または Windows\System32 フォルダーにコピーしてください。DLLをコピーしたら、それを実行することによって登録する必要があります。

regsvr32 scriptpw.dll

Vista以降でDLLを正常に登録するためには、管理者権限が必要です。私はそのような動きの合法性を調べていないので、カベレコ。


もし、あなたが オーバー

に熱心でない場合、もう 1 つの方法があります。Windows の後期バージョン (つまり ではありません。 がないもの)には、Powershell が利用できるはずです。

よりもはるかに高機能なスクリプト言語であるため、これを完全に使用するためにスクリプトをアップグレードすることを検討すべきです。 cmd.exe . しかし、もしあなたがコードの大部分を cmd.exe スクリプトにしたい場合 (例えば ロット のコードを変換したくない場合など)、同じトリックを使用することができます。

まず cmd スクリプトを修正し、CScript ではなく 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自身から実行することができます。