は、入力された資格情報のデータを検証するために書き換えられたバッチコードです:set /P
に
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "gabriel-ctCODE=fmfg1"
set "gabriel-pass=xxxyyy"
set "UserName="
set /P "UserName=User name: "
set "Password="
set /P "Password=Password: "
set "ctCODE="
set /P "ctCODE=ctCODE: "
call set "UserPass=%%%UserName%-pass%%"
call set "UserCode=%%%UserName%-ctCODE%%"
set "LoginErrorLevel=0"
if "!Password!" == "!UserPass!" set /A LoginErrorLevel+=1
if "!ctCODE!" == "!UserCode!" set /A LoginErrorLevel+=1
if not %LoginErrorLevel% == 2 goto LoginIncorrect
echo Entered credential data are valid for login.
goto EndBatch
:LoginIncorrect
echo Enter credential data not valid for login.
:EndBatch
endlocal
バッチファイルのユーザーは、環境変数が現在の値を保持するか、まだその場合には何も入力しないでする自由を持っています前に定義されていない場合は定義されません。上記のバッチコードは、ユーザーにプロンプトを表示する前に3つの環境変数が定義されていないことを確認します。
バッチファイルの利用者も通訳で、この結果として、二重引用符でvariable=value
割り当てを囲むの理由であるなど%
のようなバッチファイルを実行するための重要な文字を含む何も入力する自由、>
<
、"
を、持っていますリテラル文字として文字を入力し、文字列比較で遅延拡張を使用します。
詳細はWhy is no string output with 'echo %var%' after using 'set var = text' on command line?とPassword system does not workの回答をお読みください。ユーザがユーザ名として(いずれの場合も)gabriel
に入ると、コマンドSETが拡大するCALLを環境変数gabriel-ctCODE
とgabriel-pass
の値を適切な文字列で使用され、さらにコマンドする必要があり得るため
変数stringの中の環境変数。詳細はPass environment variables to subshell CMDの回答を参照してください。
set /A
の後の算術式は、Windowsコマンドラインインタプリタによって完全に異なる解釈が行われます。SETLOCALとENDLOCALコマンドの動作の詳細については
はthis answerをお読みください。
使用されているコマンドとその動作の基本を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されるすべてのヘルプページをすべて慎重に読み込みます。
call /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
コードが機能せず、解読できません。例を挙げてください。 – Magoo
なぜあなたはユーザーの前にダブル%を持っていますか?私たちはあなたのコードがあなたのコードの*意図*(あなたのコードの* intent *)を知らないので、適切な動作や "動作しない"ことが何であるか分かりません。 – abelenky
'%password%== %% user%-pass%'では、EnableDelayedExpansionで '%password%==!%user%-pass! 'を使用する必要があります。この管理については、[この回答](http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990)で説明しています。トピックは異なっていますが... – Aacini