windows批处理文件循环字符串

时间:2016-11-22 07:00:23

标签: batch-file

我想判断输入para是否有效,并且有一个有效字符串列表(说“aaa”,“bbb”,“ccc”,“ddd”是正确的),但我不喜欢使用if-else。我想要一个简单的方法来做到这一点。 我喜欢这样的东西:

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和magoo。

我的决议如下:

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

2 个答案:

答案 0 :(得分:1)

不知道您要做什么,但如果比较结果为真,那么您提供的代码将回显true else goto end

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

会在匹配项上回显true,否则请转到end。括号的定位至关重要 - ) else (必须位于同一物理线上。

答案 1 :(得分:1)

首先,我想指出NEW_ZEND / 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...