2010-05-05 35 views
5

Tôi gặp vấn đề về tập lệnh batch của Windows mà tôi đang chống lại (không có ý định chơi chữ). Các kịch bản có vấn đề như sau:Cách đặt PATH thành giá trị biến khác với dấu cách trong tệp lô Windows

if defined _OLD_VIRTUAL_PATH (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Khi tôi chạy nó và _OLD_VIRTUAL_PATH được thiết lập tôi nhận được:

\Microsoft was unexpected at this time. 

_OLD_VIRTUAL_PATH là một biến mà ban đầu được thiết lập từ PATH và nó chứa dấu cách - Tôi khá chắc chắn đó là vấn đề. Nhưng giải pháp là gì? Nó chạy thành công nếu tôi đính kèm nó trong dấu ngoặc kép, nhưng tôi không nghĩ rằng toàn bộ giá trị của biến số PATH được cho là có dấu ngoặc kép.

Trả lời

7

Vấn đề của bạn ở đây không phải là dấu cách mà là dấu ngoặc đơn đóng. Có thể bạn đang chạy một hệ thống 64 bit, trong đó thư mục Program Files cho các ứng dụng 32-bit là Program Files (x86). Trong một khối được chặn trong một tệp bó, dấu ngoặc đơn đóng sẽ kết thúc khối, do đó phần còn lại của dòng sẽ gây ra lỗi cú pháp.

Bạn có hai cách để sửa lỗi này:

1) Đặt set lập luận hoàn toàn trong dấu ngoặc kép. Điều này làm cho paren đóng cửa để không được công nhận là cuối khối:

if defined _OLD_VIRTUAL_PATH (
    set "PATH=%_OLD_VIRTUAL_PATH%" 
) 

2) Không sử dụng một khối:

if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 
+0

Wow - Tôi đã học được 2 điều hôm nay ... Tôi chắc chắn rằng cú pháp này sẽ nổ tung, nhưng chắc chắn, nó hoạt động. Tuy nhiên, tôi không chắc tại sao nó lại cần thiết cho Evgeny - việc thiết lập một PATH với không gian chưa bao giờ là vấn đề đối với tôi mà không sử dụng dấu ngoặc kép. Có lẽ '_OLD_VIRTUAL_PATH' của Evgeny có một số ký tự đặc biệt khác (không phải là dấu cách) cần trích dẫn? –

+2

@Michael: Đó không phải là không gian có vấn đề. Tôi viết lại bài viết (hy vọng Chris không bận tâm; anh ấy có thể quay lại nếu cần) và giải thích điều gì là sai và tại sao. – Joey

+0

Cảm ơn Johannes, tôi đã quên lý do, nhưng điều đó chắc chắn có ý nghĩa. –

0

Vâng - Tôi không bao giờ biết về defined hoạt động trong các kịch bản cmd cho đến khi ngay bây giờ ...

kịch bản của bạn dường như làm việc tốt đối với tôi - mà dòng chính xác được sinh ra lỗi?

Bạn cũng có thể thử:

if not "%_OLD_VIRTUAL_PATH%" == "" (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Và tin tôi đi, nếu bạn đang đến vào Windows cmd kịch bản mong nó sẽ được bất cứ điều gì giống như những gì bạn có trong bash, người đứng đầu của bạn sẽ được rất nhiều đau đớn, rất sớm. Bạn có thể muốn xem xét sử dụng một số ngôn ngữ kịch bản khác (PowerShell, Python, PERL - bất kỳ thứ gì) nếu kịch bản lệnh cmd không phải là một yêu cầu tuyệt đối. điều lớn nhất (có thể là điều duy nhất) mà kịch bản lệnh cmd đã cho nó là nó đã được cài đặt trên mọi hộp Windows.

+0

Có một "định nghĩa" nhà điều hành trong Command Extensions - dòng công trình ĐƯỢC. Đó là dòng 'set' thất bại. – EMP

+0

lệnh thiết lập hoạt động tốt cho tôi, ngay cả với dấu cách trong '_OLD_VIRTUAL_PATH'. '_OLD_VIRTUAL_PATH' được đặt chính xác là gì? Là kịch bản của bạn được định dạng chính xác như bạn có nó trong câu hỏi (cmd.exe có thể rất cầu kỳ về cú pháp, và không phải luôn luôn một cách trực quan). –

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