[解決済み] batファイルの入力テキストをマスクすることはできますか?
質問
他のプログラムを実行するためのバッチファイルを書いています。この場合、パスワードを要求する必要があります。入力テキストをマスクする方法はありますか? 入力文字の代わりに******文字を表示する必要はありません。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自身から実行することができます。
関連
-
[解決済み] 非常に基本的なバッチ式自己複製コード:どのくらい危険か?
-
[解決済み] バッチファイルに引数を渡すにはどうしたらいいですか?
-
[解決済み] Windowsのバッチファイルから長いコマンドを複数行に分割する
-
[解決済み] 1つの.BATファイル内で複数の.BATファイルを実行する方法
-
[解決済み] バッチファイル内で改行をエコーする方法を教えてください。
-
[解決済み] N日以上前のファイルを削除するバッチファイル
-
[解決済み] Windowsのシャットダウン、再起動、ログオフをbatファイルで行うには?
-
[解決済み] バッチファイルでの変数の定義と使用
-
[解決済み】Windowsのバッチファイル:.batと.cmdの違いは?
-
[解決済み】BATファイル実行後、CMDを開いたままにする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XCOPYを使用した無効なドライブ指定
-
[解決済み] 非常に基本的なバッチ式自己複製コード:どのくらい危険か?
-
[解決済み] ls' は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。
-
[解決済み】バッチファイルをエラー発生時に終了させる方法は?
-
[解決済み】not-equal(inequality)演算子の一括処理について
-
[解決済み] バッチファイル内でファイルの内容を変数に読み込むには?
-
[解決済み] バッチファイルです。ディレクトリ内の全ファイル、フォルダを削除する
-
[解決済み] バッチファイルを使用してカレントワーキングディレクトリを変更する方法
-
[解決済み] DOSバッチファイルでの複数行コメント
-
[解決済み] npm install コマンドで .bat ファイルを作成する