2012-06-27 34 views
5

Tôi muốn kiểm tra xem đối số cho tệp lô có hợp lệ dựa trên danh sách chuỗi không.Cách tìm chuỗi nếu có trong danh sách chuỗi trong tệp lô DOS

Ví dụ:

IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1 

này sẽ thiết lập ARG đến một trong các đối số chỉ có giá trị nếu nó phù hợp. Lý tưởng nhất là phân biệt chữ hoa chữ thường.

Trả lời

3

Bạn cũng có thể sử dụng mảng cách tiếp cận:

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]!" 

Theo tôi, phương pháp này là rõ ràng hơn và dễ quản lý với nhiều tùy chọn. Ví dụ, bạn có thể tạo các mảng của các đối số có giá trị theo cách này:

set i=0 
for %%a in (validArgument1 validArgument2 validArgument3) do (
    set /A i+=1 
    set arg[!i!]=%%a 
) 

Một khả năng khác là để xác định một biến cho mỗi đối số hợp lệ:

for %%a in (validArgument1 validArgument2 validArgument3) do set %%a=1 

... và sau đó chỉ cần kiểm tra thông số theo cách này:

if defined %1 (
    echo %1 is valid option... 
    SET ARG=%1 
) 
+0

Đó 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

+0

@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

+2

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

4

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.

+0

Dave: bạn có biết lệnh 'gọi' với nhãn không tồn tại không _không hủy bỏ việc thực hiện chương trình? Xem giải pháp của Kevin dưới đây ... – Aacini

+0

Tôi nghĩ rằng bạn đã bỏ lỡ việc làm trong vòng lặp cuối cùng – Knitschi

Các vấn đề liên quan