2009-11-07 25 views
6

Tôi không biết làm thế nào để mô tả chính xác những gì tôi đang cố gắng làm nhưng đây là một tệp mẫu ví dụ minh họa những gì tôi không thể tìm ra:Làm cách nào để đặt biến môi trường thành giá trị có dấu cách trong tệp lô?

Tôi có một tệp lô. Bên trong tập tin batch Tôi đang cố gắng để tạo ra một thư mục:

Set CopyFrom = %~dp0 

if Exist "%ProgramFiles(x86)" (
    Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces 
) 

md %TargetDir%\NewSubFolder 
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder 

tập tin thực thi của tôi là thất bại trên dòng 4 Set TargetDir =... với:

\My was unexpected at this time 

Tôi giả định này là bởi vì tôi có khoảng trống trong tôi tên đường dẫn. Tôi nghĩ tôi chỉ có thể quấn biến của tôi với dấu ngoặc kép:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces" 

Nhưng rồi khi tôi nhận được vào dòng mà tạo ra các thư mục nó không thành công vì %TargetDir% hiện đang được bọc trong dấu ngoặc kép. md "%TargetDir%"\NewSubFolder

Điều này có thể được khắc phục hay tôi nên viết một VBScript để sắp xếp mọi thứ?

Trả lời

6

Chỉ cần đặt biểu hiện của bạn trong dấu ngoặc kép như thế này:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces" 
C:\>echo %TargetDir% 
C:\Program Files\My Directory Name has spaces 

Lưu ý: Nó sẽ mở rộng biến trong dấu ngoặc kép, và nếu nó quá có không gian, nó sẽ cần phải được trích dẫn.

Bây giờ bạn có thể báo nó để thực hiện thao tác của bạn:

md "%TargetDir%\NewSubFolder" 
+0

Cảm ơn, đó chỉ là vé, được nhiều người đánh giá cao. – BobTheBuilder

+0

Nó không bao giờ xảy ra với tôi rằng tôi có thể bọc toàn bộ mục sau khi Đặt trong dấu ngoặc kép ... tất nhiên, nó không chính xác trực quan? – BobTheBuilder

+0

Không, không trực quan. (Không nhiều về cửa sổ dòng lệnh là - đó là lý do tại sao tôi chuyển sang powershell). Tôi nghĩ về nó như thế này: cả hai bên của "=" là một đối số duy nhất cho lệnh set. – zdan

2

Các vấn đề trong câu hỏi ở đây là không các không gian như những người khác đề nghị, mà là đóng ngoặc trong biến môi trường ProgramFiles(x86) Điều này làm cho phân tích cú pháp để nghĩ rằng khối kết thúc sớm (shameless self-promotion).

Báo giá do trợ giúp trong trường hợp này vì chúng làm cho trình phân tích cú pháp nhảy qua toàn bộ phần được trích dẫn và giả sử đúng dấu ngoặc đơn sau để đóng ngoặc đơn thực tế. nhưng việc sửa chữa có thể dễ dàng hơn nhiều so với việc đó:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces 

Tại sao sử dụng một khối được chặn nếu tất cả các bạn đặt chính xác một lệnh vào nó?

set tự nó không cần bất kỳ dấu ngoặc kép, trừ khi đối số của nó chứa các ký tự đặc biệt như <, >, |, & mà vỏ thân aready xử lý. Nó không phải là thuốc chữa bách bệnh, mặc dù điều đó làm cho việc xử lý nội dung của người dùng hoặc nội dung tập tin chính xác là một cơn đau ở lần.

Ngoài ra, vui lòng không bao giờ đặt khoảng trắng xung quanh = trong lệnh set. Điều này sẽ gây ra biến môi trường được tạo với tên tên kết thúc bằng dấu cách và nội dung của nó bắt đầu bằng dấu cách.Điều này đã được một phần sửa chữa trong Windows 7 bằng cách âm thầm tạo ra cả hai biến với không gian ở cuối và một không có:

> set foo = bar 
> set foo 
foo=bar 
foo = bar 

Nhưng trong phiên bản trước của Windows này đã không xảy ra vì vậy chỉ cần không bao giờ sử dụng không gian xung quanh = trừ bạn biết đây là những gì bạn muốn :-)

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