2012-09-07 29 views
5

Tôi muốn sử dụng 2 đối số đầu tiên được chuyển đến một tệp lô và sau đó chắp thêm mọi thứ khác vào lệnh được thực thi trong tệp lô.Làm cách nào để chuyển các đối số thừa bổ sung vào một tệp lô?

Có cách nào dễ dàng để làm điều đó không?

// batch file 
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line} 

Lô sẽ được thực thi như thế này

batch.bat USR PWD -Dargument1=1 -Dargument2=2 

có hiệu quả, tôi muốn những điều sau để được thực thi

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

Trả lời

3

for lệnh nên cung cấp cho bạn những gì bạn muốn:

for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c 

Từ sự giúp đỡ cho for (for /?):


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k sẽ phân tích mỗi dòng trong myfile.txt, bỏ qua dòng bắt đầu với một dấu chấm phẩy, chuyển mã thông báo thứ 2 và thứ 3 từ mỗi dòng đến cho nội dung , với mã thông báo được phân tách bằng dấu phẩy và/hoặc dấu cách. Lưu ý rằng đối với báo cáo nội dung số tham chiếu% i để nhận mã thông báo thứ 2,% j để nhận mã thông báo thứ 3 và% k để nhận tất cả các mã còn lại sau ngày thứ 3. Đối với tên tệp có chứa dấu cách, bạn cần phải báo giá tên tệp với dấu ngoặc kép là . Để sử dụng dấu ngoặc kép theo cách này, bạn cũng cần cần sử dụng tùy chọn usebackq, nếu không dấu ngoặc kép sẽ là được hiểu là xác định chuỗi ký tự để phân tích cú pháp.


Vì vậy, trong giải pháp của tôi, %%a có giá trị của các đối số đầu tiên truyền cho các kịch bản, %%b giá trị của đối số thứ hai, và %%c các đối số còn lại.

Khi tôi chạy batch.bat USR PWD -Dargument1=1 -Dargument2=2 từ một dấu nhắc lệnh tôi nhận được:

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

Tháo echo sau do để gọi lệnh của bạn với các đối số.

+1

Điều này hoạt động miễn là không phải trong số 2 đối số đầu tiên chứa dấu cách được trích dẫn. Nhưng nó sẽ thất bại nếu một trong hai đối số chứa dấu cách được trích dẫn - có thể không phải là vấn đề với tên người dùng hoặc mật khẩu, đặt chắc chắn không được chấp nhận làm giải pháp chung. – dbenham

+0

@dbenham; bạn là chính xác, vượt qua bất kỳ loại chuỗi trích dẫn nào và tất cả các phiên cược đều bị tắt. –

+0

Trên thực tế trích dẫn args là OK miễn là các dấu ngoặc kép được cân bằng và arg không chứa dấu cách hoặc ký tự đặc biệt như '&' '|' v.v .. Một vấn đề tiềm năng khác - đối số cũng có thể được phân tách bằng ',' ';' hoặc '=' thay vì không gian. – dbenham

1

Đây có thể là những gì bạn muốn

C:>help shift 
Changes the position of replaceable parameters in a batch file. 

SHIFT [/n] 

If Command Extensions are enabled the SHIFT command supports 
the /n switch which tells the command to start shifting at the 
nth argument, where n may be between zero and eight. For example: 

    SHIFT /2 

would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected. 
+0

Nhưng nó sẽ không giúp đỡ ở đây, như SHIFT chỉ có tác dụng đối với các thông số '% 1'..'% 9' nhưng KHÔNG cho '% *'. Vì vậy, không có một cách đơn giản để nhận được tất cả các tham số mà không có một số tham số tiền tố – jeb

2

Giải pháp Patrick Cuff thường hoạt động, nhưng nó sẽ thất bại nếu một trong hai đối số đầu tiên chứa dấu cách được trích dẫn hoặc ký tự đặc biệt. Nó cũng sẽ thất bại nếu các đối số được phân cách với một cái gì đó khác với không gian. Các dấu phân tách FOR/F có thể được mở rộng để bao gồm ,;=, nhưng sau đó nó sẽ thất bại nếu đối số có chứa bất kỳ dấu phân tách được trích dẫn nào.

Cải tiến sau đây hỗ trợ các ký tự đặc biệt được trích dẫn như &|, nhưng các dấu phân tách đối số vẫn là một vấn đề.

@echo off 
setlocal enableDelayedExpansion 
set args=%* 
for /f "tokens=1,2*" %%a in ("!args!") do (
    endlocal 
    echo arg1=%%a arg2=%%b remainder=%%c 
) 

EDITĐây là một thay đổi đơn giản sử dụng USEBACKQ mà đạt được điều tương tự

for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a arg2=%%b remainder=%%c 

End chỉnh sửa

Đáng tiếc là một giải pháp thực sự nói chung đòi hỏi một vòng lặp GOTO phân tích mọi thông số từ 3 trở đi. Giải pháp dưới đây sẽ hoạt động miễn là tất cả các dấu ngoặc kép đều được cân bằng và tất cả các ký tự đặc biệt được trích dẫn.

@echo off 
setlocal 
set "args=" 
:parseArgs 
set args=%args% %3 
shift /3 
if "%~3" neq "" goto :parseArgs 
if (%3) equ ("") goto :parseArgs 
echo arg1=%1 arg2=%2 remainder=%args% 

Để loại bỏ tất cả các hạn chế sẽ đòi hỏi các biện pháp quyết liệt - xem How to receive even the strangest command line parameters?

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