2016-11-22 128 views
0

我想判斷輸入段是否有效,並且有一個有效字符串列表(說「aaa」,「bbb」,「ccc」,「ddd」是正確的),但我不喜歡使用if-else。我想要一個簡單的方法來做到這一點。 我喜歡的東西,如:windows批處理文件中的字符串循環

set env=%1 
for %%A in ("aaa" "bbb" "ccc" "ddd") do if "%env%"==%%A echo true else goto end 

我不知道該怎麼做了這一點。

我想是這樣的:

set env=%1 
if "%env%"neq"aaa" and "%env%"neq"bbb" and "%env%"neq"ccc"and "%env%"neq"ddd" (
    goto end 
) 

感謝aschipfl和脫線。

我的決心是:

for %%a in (aaa bbb ccc ddd) do (
    if "%env%"=="%%a" (
    goto next  
    ) 
) 
@echo Wrong parameter! 
goto end 
:next 
+2

[如何查找字符串是否在DOS批處理文件中的字符串列表]中可能的重複(http://stackoverflow.com/questions/11235153/how-to-find-if-a-string-是-IN-A-列表的串-IN-A-DOS的批處理文件) –

回答

1

起初,我想指出的if/else子句的基本問題:

if "%env%"==%%A echo true else goto end 

解析器對待比較表達式作爲單個命令行後的整個部分,因此,如果比較是積極的,true else goto end將會得到迴應。爲了解決這個你需要顯示在if聲明放置括號,這樣結束解析器...:

if "%env%"=="%%~A" (echo true) else goto end 

...或者這個,如果要分攤到多行:

if "%env%"=="%%~A" (
    echo true 
) else (
    goto end 
) 

另外,我用"%%~A"替換了%%A,以確保比較表達式的右邊部分始終放在引號內,即使您提供了像"aaa" bbb "ccc" ddd這樣的字符串列表。


據我瞭解你想去:end的情況下,第一個參數%1不匹配任何給定的字符串。代碼中存在邏輯錯誤,因爲即使遇到匹配,您也將始終跳轉到:end(因爲仍然存在三個不匹配),因此else子句肯定會執行(假設您已更正if/else語法,如前所述)。

如下你可以改變的代碼(使用FLAG變量,指示匹配已經發現):

set "FLAG=" 
for %%A in ("aaa" "bbb" "ccc" "ddd") do (
    if "%~1"=="%%~A" (
     set "FLAG=true" 
    ) 
) 
if not defined FLAG goto :end 
rem // Execution continues here in case a match has been found... 

或者,你可以這樣做(使用其他goto離開環路):

for %%A in ("aaa" "bbb" "ccc" "ddd") do (
    if "%~1"=="%%~A" (
     goto :found 
    ) 
) 
goto :end 
:found 
rem // Execution continues here in case a match has been found... 

請注意,上面的代碼片段會區分大小寫的字符串比較;要改變這種情況,請使用if /I

1

不知道你想要做什麼,但你給出的代碼將呼應true else goto end如果比較結果爲真。

if "%env%"==%%A (echo true) else (goto end) 

將回顯在比賽true,否則進入end。托架的位置至關重要 - ) else (必須位於同一條物理線路上。

相關問題