這裏被改寫爲驗證輸入的憑證數據批處理代碼:
@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
在set /P
批處理文件的用戶可以自由在這種情況下,環境變量保持其當前值或仍是進入什麼沒有定義,如果沒有定義之前。上面的批處理代碼確保在提示用戶之前未定義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-ctCODE
和gabriel-pass
的值時,用戶輸入gabriel
(在任何情況下),爲用戶名,該命令SET必須以適當的字符串一起使用並且附加命令CALL擴大變量字符串中的環境變量。有關詳細信息,請參閱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