2013-12-13 14 views
8

Tôi đã viết một tập tin batch để khởi chạy một ứng dụng (ứng dụng không phải của tôi, tôi không thể sửa đổi nó). Bản thân tập tin batch chấp nhận một số tham số. Ứng dụng chấp nhận các tham số khác. Tập tin batch sử dụng tất cả các tùy chọn của nó, sử dụng SHIFT, sau đó khởi chạy ứng dụng với môi trường chính xác và chuyển các tham số còn lại cho ứng dụng. Ví dụ về việc gọi tệp lô:Bảo quản ký tự "=" (bằng) trong tham số tập tin batch

script.bat -opt-1 -opt-2 /opt-a /opt-b=value 

Trong ví dụ "-opt-1" và "-opt-2" được tiêu thụ bởi script.bat. Cuối cùng, nó phải gọi ứng dụng gốc với các tham số "/ opt-a" và "/ opt-b = value". Dấu "=" trong tham số cuối cùng được mong đợi bởi ứng dụng, tôi không thể thay đổi nó. Nó hoạt động tốt khi tôi gọi ứng dụng trực tiếp từ dòng lệnh.

Nhưng khi tôi gọi nó từ tập lệnh, ứng dụng nhận được 2 tham số cho "/ opt-b = value": cả "/ opt-b" và "value". Nếu tôi sử dụng "% *" khi tôi gọi ứng dụng, dấu "=" được giữ nguyên, nhưng tất cả các thông số đều được chuyển (bao gồm các tham số bị bỏ qua bằng SHIFT).

Có cách nào để chỉ chuyển các thông số cuối cùng và giữ lại dấu "=" không?

+0

Có lẽ bạn có thể sử dụng ký tự thoát ra DOS của: '^' –

+0

Tôi đã thử nó, nó không hoạt động. Không có dấu ngoặc kép '' 'hoặc' '' –

+0

Có lẽ bạn có thể đăng tập lệnh của mình để mọi người có thể sao chép và dán nó, xem có gì sai và đề xuất sửa lỗi. – indiv

Trả lời

3

Gọi script.bat bạn theo cách này:

script.bat -opt-1 -opt-2 /opt-a "/opt-b=value" 

và bên script.bat, gọi ứng dụng theo cách này:

rem Consume -opt-1 
shift 
rem Consume -opt-2 
shift 
rem Call the application 
application %1 %~2 

EDIT: Response to các ý kiến ​​

Ok. Cho phép xem lại vấn đề này với chi tiết.

File script.bat dưới đây:

@echo off 
rem Consume -opt-1 
shift 
rem Consume -opt-2 
shift 
rem Call the application 
ECHO application %1 %~2 

(xin vui lòng, lưu ý các lệnh ECHO) một cách chính xác "gọi" các ứng dụng với tham số thứ hai bao gồm một bằng-dấu khi tham số thứ tư của nó được kèm theo trong dấu ngoặc kép, như sản lượng hiển thị màn hình tiếp theo:

C:\> script.bat -opt-1 -opt-2 /opt-a "/opt-b=value" 
application /opt-a /opt-b=value 

Tuy nhiên, nếu việc áp dụng lÀ MỘT BATCH FILE, sau đó nó bị cùng một vấn đề của tệp script.bat gốc. Bạn nói rằng "Nó hoạt động tốt khi tôi gọi ứng dụng trực tiếp từ dòng lệnh". Vâng, điều này không đúng:

C:\> type application.bat 
@echo off 
rem ** application.bat ** 
echo 1: %1 
echo 2: %2 
echo 3: %3 
echo 4: %4 

C:\> application /opt-a /opt-b=value 
1: /opt-a 
2: /opt-b 
3: value 
4: 

Tham số của tệp Batch có thể được phân tách bằng dấu phẩy, dấu chấm phẩy hoặc dấu bằng, ngoài dấu cách và tab. Bằng cách này, nếu "The" = "đăng nhập tham số cuối cùng được mong đợi bởi ứng dụng", thì không có cách nào ứng dụng là một tệp Batch và không có ý nghĩa để kiểm tra phương pháp này với tệp Batch thay vì ứng dụng.

Bạn đã thử nghiệm giải pháp này với ứng dụng thực thực?

+0

Cảm ơn bạn Thật không may, khi tôi thử lệnh trên với các kịch bản sau đây:.!

 rem ** script.bat ** rem Consume -opt-1 shift rem Consume -opt-2 shift rem Call the application call %~dp0\application.bat %1 %~2 
 rem ** application.bat ** echo 1: %1 echo 2: %2 echo 3: %3 echo 4: %4 
khi được gọi với 'script.bat -opt-1 -opt-2/opt-a "/ opt-b = value" ', đầu ra là:
 1: /opt-a 2: /opt-b 3: 4: 
thay vì dự kiến ​​(tất cả tôi muốn thông số tham số):
 1: /opt-a 2: /opt-b=value 3: 4: 

+0

Xin lỗi, tôi không chắc chắn cách thêm nhận xét được định dạng tốt như bình luận của bạn ở trên (bằng cách định dạng đúng tệp). Vấn đề là giải pháp của bạn, như tôi đã thử, chuyển '/ opt-b' thay vì'/opt-b = value'. –

+0

@ FlorentGeorges: Tôi nghĩ có sự nhầm lẫn ở đây; đọc sửa trong câu trả lời của tôi ... – Aacini

1
FOR /f "tokens=1*" %%x IN ("%*") DO ECHO application %%y 

trong đó 1 là số tham số cần bỏ qua.


Testing ... chính .bat (q20572424.bat)

@ECHO OFF 
SETLOCAL 
ECHO master[%*] 
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424a.bat %%y 
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424a.bat %%y 
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424a.bat %%x 
GOTO :EOF 

Công ty con .bat (q20572424a.bat)

@ECHO OFF 
SETLOCAL 
ECHO slave=[%*] 
FOR /f "tokens=2*" %%x IN ("%*") DO CALL q20572424b.bat %%y 
FOR /f "tokens=1*" %%x IN ("%*") DO CALL q20572424b.bat %%y 
FOR /f "tokens=*" %%x IN ("%*") DO CALL q20572424b.bat %%x 
GOTO :EOF 

Thứ hai chi nhánh .bat (q20572424b.bat)

@ECHO OFF 
SETLOCAL 
ECHO subslave=[%*] 
GOTO :EOF 

Kết quả:

Từ chạy q20572424 -opt-1 -opt-2 /opt-a /opt-b=value

master[-opt-1 -opt-2 /opt-a /opt-b=value] 
slave=[/opt-a /opt-b=value] 
subslave=[] 
subslave=[/opt-b=value] 
subslave=[/opt-a /opt-b=value] 
slave=[-opt-2 /opt-a /opt-b=value] 
subslave=[/opt-b=value] 
subslave=[/opt-a /opt-b=value] 
subslave=[-opt-2 /opt-a /opt-b=value] 
slave=[-opt-1 -opt-2 /opt-a /opt-b=value] 
subslave=[/opt-a /opt-b=value] 
subslave=[-opt-2 /opt-a /opt-b=value] 
subslave=[-opt-1 -opt-2 /opt-a /opt-b=value] 

Mà dường như là chính xác. Trong mỗi trường hợp, lô công ty con nhận được các thông số nguyên văn; số lượng các thông số hàng đầu bị loại bỏ là 2,1,0 cho mỗi cuộc gọi.

W7HP - phù hợp với tôi!

+0

Cảm ơn bạn! Điều này thực sự hiển thị câu trả lời đúng với 'echo'. Nhưng nếu bạn thay đổi 'echo' bằng cách thực sự gọi ứng dụng, ví dụ: 'call% ~ dp0 \ application.bat' trong đó application.bat hiển thị các tham số của nó, kết quả là:' 1:/opt-a, 2:/opt-b, 3: value'. Vì vậy, tham số cuối cùng đã thực sự được chia thành 2 ... Kết quả mong đợi là khá: '1:/opt-a, 2:/opt-b = value'. –

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