Câu trả lời ngắn gọn - sử dụng dấu ngoặc vuông:
if [%1]==[] goto :blank
hoặc (khi bạn cần xử lý các args được trích dẫn, hãy xem Chỉnh sửa bên dưới):
if [%~1]==[] goto :blank
Tại sao? bạn có thể hỏi. Vâng, đúng như Jeremiah Willcock đã đề cập: http://ss64.com/nt/if.html - họ sử dụng điều đó! OK, nhưng có gì sai với dấu ngoặc kép?
Một lần nữa, câu trả lời ngắn gọn: chúng rất "kỳ diệu" - đôi khi dấu ngoặc kép (kép) được chuyển đổi thành báo giá đơn (kép). Và họ cần phải phù hợp để bắt đầu.
Hãy xem xét kịch bản nhỏ này:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Hãy kiểm tra nó:
C:\> argq bla bla
bla
bla
Done.
Có vẻ hiệu quả. Nhưng bây giờ, hãy chuyển sang thiết bị thứ hai:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom Điều này không đánh giá đúng, cũng không đánh giá sai. Kịch bản ĐÃ CHẾT. Nếu bạn được cho là phải tắt lò phản ứng ở đâu đó dưới dây, thì - thật may mắn. Bây giờ bạn sẽ chết như Harry Daghlian.
Bạn có thể nghĩ - OK, các đối số không được chứa dấu ngoặc kép. Nếu họ làm vậy, điều này sẽ xảy ra. Sai Đây là một số an ủi:
C:\> argq ""bla bla""
""bla
bla""
Done.
Ồ vâng. Đừng lo lắng - đôi khi điều này sẽ hiệu quả.
Hãy thử một tập lệnh khác:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Bạn có thể tự kiểm tra xem nó hoạt động tốt cho các trường hợp trên. Điều này là hợp lý - dấu ngoặc kép không liên quan gì đến dấu ngoặc, vì vậy không có phép thuật nào ở đây. Nhưng những gì về spicing args lên với dấu ngoặc?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Không có may mắn ở đó. Dấu ngoặc đơn không thể nghẹt thởcmd.exe
trình phân tích cú pháp.
Chúng ta hãy quay trở lại những câu trích dẫn độc ác một chút. Vấn đề là ở đó, khi cuộc tranh luận kết thúc bằng một câu trích dẫn:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Điều gì sẽ xảy ra nếu tôi chỉ vượt qua:
D:\>argq bla2"
The syntax of the command is incorrect.
Tập lệnh hoàn toàn không chạy. Tương tự cho args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Nhưng tôi nhận được gì, khi số "
ký tự-ký tự "khớp" (tức là - là số chẵn), trong trường hợp như vậy:
D:\>args bla2" "bla3
bla2" "bla3
Done.
ĐẸP - Tôi hy vọng bạn đã học được điều gì đó về cách .bat
các tệp phân chia các đối số dòng lệnh của chúng (GỢI Ý: * Nó không chính xác như trong bash). Đối số trên chứa một khoảng trắng. Nhưng các dấu ngoặc kép không tự động bị loại bỏ.
Và argq? Làm thế nào nó phản ứng với điều đó? Có thể đoán trước:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Vì vậy - hãy suy nghĩ trước khi bạn nói: "Biết gì không? Chỉ cần sử dụng dấu ngoặc kép. [Bởi vì, với tôi, điều này trông đẹp hơn]".
Biên tập
Gần đây, đã có những nhận xét về câu trả lời này - tốt, dấu ngoặc vuông "không thể xử lý" chuyển các đối số được trích dẫn và xử lý chúng như thể chúng không được trích dẫn.
Cú pháp:
if "%~1"=="" (...)
Không phải là một số tính năng mới được tìm thấy của dấu ngoặc kép, mà là sự thể hiện một tính năng gọn gàng của việc loại bỏ dấu ngoặc kép khỏi biến đối số, nếu ký tự đầu tiên và cuối cùng là dấu ngoặc kép.
"Công nghệ" này hoạt động tốt với dấu ngoặc vuông:
if [%~1]==[] (...)
Đó là một điều hữu ích khi chỉ ra điều này, vì vậy tôi cũng ủng hộ câu trả lời mới.
Cuối cùng, những người hâm mộ dấu ngoặc kép, một đối số dạng này ""
có tồn tại trong sách của bạn không, hay nó trống? Chỉ là hỏi thế thôi' ;)
GOTO BLANK
dòng) vào haiIF
câu lệnh còn lại, điều đó có khắc phục được sự cố không?