我想檢查一個批處理文件的參數是否有效基於字符串列表。如何查找字符串是否在DOS批處理文件中的字符串列表
例如:
IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
這將設置ARG到的,只有當它匹配了有效的論據之一。理想情況下不區分大小寫。
我想檢查一個批處理文件的參數是否有效基於字符串列表。如何查找字符串是否在DOS批處理文件中的字符串列表
例如:
IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
這將設置ARG到的,只有當它匹配了有效的論據之一。理想情況下不區分大小寫。
您也可以使用陣列方法:
setlocal EnableDelayedExpansion
set arg[1]=validArgument1
set arg[2]=validArgument2
set arg[3]=validArgument3
for /L %%i in (1,1,3) do if /I "%1" equ "!arg[%%i]!" SET "ARG=!arg[%%i]!"
在我看來,這種方法更清晰,更易於管理多個選項。例如,您可以創建的有效參數數組是這樣的:
set i=0
for %%a in (validArgument1 validArgument2 validArgument3) do (
set /A i+=1
set arg[!i!]=%%a
)
另一種可能性是定義一個變量對每個有效的參數:
for %%a in (validArgument1 validArgument2 validArgument3) do set %%a=1
...然後只檢查參數如下:
if defined %1 (
echo %1 is valid option...
SET ARG=%1
)
的魯棒的方法是使用延遲擴展
setlocal enableDelayedExpansion
set "validArgs=;arg1;arg2;arg3;"
if "!validArgs:;%~1;=!" neq "!validArgs!" set ARG=%1
它也可以使用CALL與正常膨脹一起進行,但它更可能失敗,這取決於參數的值。上述
set "validArgs=;arg1;arg2;arg3;"
call set "test=%%validArgs:;%~1;=%%"
if "%test%" neq "%validArgs%" set ARG=%1
這兩種技術都沒有有效的精氨酸可以包含=
和args不能以*
啓動的限制。
你也可以,只要使用下面的蠻力方法,沒有有效的args來包含*
?
,
;
=
或<space>
set "validArgs=arg1;arg2;arg3"
for %%A in (%validArgs%) if /i "%~1"=="%%A" set ARG=%1
你可能想看看這個argument parser。你可以調整這些代碼,或者爲你自己的獨特策略引發一些想法。
這是非常感謝。我希望有一個更簡潔的方法來創建陣列,但這將完美地工作。 – justinhj
@justinhj - 當你編輯某人的帖子時,你需要更加小心。你實際上引入了一個錯誤。它的工作原理與(for/L %% i in(1,1,3)'或'for %% i in(1,2,3)'一樣。但你在(1,2,3)'中編輯'for/L %% i'不會給出正確的答案。我編輯了答案,回到了Aacini原來的樣子。 – dbenham
您的第二個選項需要處理未提供%1的情況。爲每個參數名稱添加一個虛擬前綴將解決它。 – Kevin