2016-11-22 131 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 (必须位于同一条物理线路上。

相关问题