Một phương pháp mạnh mẽ là sử dụng mở rộng chậm
setlocal enableDelayedExpansion
set "validArgs=;arg1;arg2;arg3;"
if "!validArgs:;%~1;=!" neq "!validArgs!" set ARG=%1
Nó cũng có thể được thực hiện bằng CALL cùng với việc mở rộng bình thường, nhưng nó có nhiều khả năng thất bại, tùy thuộc vào giá trị của các tham số.
set "validArgs=;arg1;arg2;arg3;"
call set "test=%%validArgs:;%~1;=%%"
if "%test%" neq "%validArgs%" set ARG=%1
Cả hai kỹ thuật trên có một giới hạn mà không có arg hợp lệ có thể chứa =
và args không phải bắt đầu với *
.
Bạn cũng có thể sử dụng phương pháp brute force sau miễn là không ai trong số các args hợp lệ chứa *
?
,
;
=
hoặc <space>
set "validArgs=arg1;arg2;arg3"
for %%A in (%validArgs%) if /i "%~1"=="%%A" set ARG=%1
Bạn có thể muốn có một cái nhìn tại argument parser này. Bạn có thể điều chỉnh mã đó, hoặc nó có thể châm ngòi một số ý tưởng cho chiến lược độc đáo của riêng bạn.
Đó là lời cảm ơn tuyệt vời. Tôi muốn có một cách ngắn gọn hơn để tạo mảng nhưng điều này sẽ hoạt động hoàn hảo. – justinhj
@justinhj - Bạn cần phải cẩn thận hơn khi bạn chỉnh sửa bài đăng của một người nào đó. Bạn thực sự đã giới thiệu một lỗi. Nó hoạt động như ban đầu được viết với 'for/L %% i in (1,1,3)', hoặc là 'cho %% i in (1,2,3)'. Nhưng chỉnh sửa của bạn về 'for/L %% i in (1,2,3)' sẽ không đưa ra câu trả lời đúng. Tôi đã chỉnh sửa câu trả lời về cách Aacini ban đầu có nó. – dbenham
Tùy chọn thứ hai của bạn cần xử lý trường hợp% 1 không được cung cấp. Thêm tiền tố giả vào mỗi tên đối số sẽ giải quyết nó. – Kevin