2010-02-02 32 views
7

Tôi đang cố xóa một số tệp có ký tự unicode trong chúng bằng tập lệnh batch (đó là yêu cầu). Vì vậy, tôi chạy cmd và thực thi:Kịch bản lệnh hàng loạt không được thực thi nếu chcp được gọi là

> chcp 65001 

Thiết lập mã hóa hiệu quả cho UTF-8. Và nó hoạt động:

D:\temp\1>dir 
Volume in drive D has no label. 
Volume Serial Number is 8C33-61BF 

Directory of D:\temp\1 

02.02.2010 09:31 <DIR>   . 
02.02.2010 09:31 <DIR>   .. 
02.02.2010 09:32    508 1.txt 
02.02.2010 09:28    12 delete.bat 
02.02.2010 09:20    95 delete.cmd 
02.02.2010 09:13 <DIR>   Rún 
02.02.2010 09:13 <DIR>   Гуцул Каліпсо 
       3 File(s)   615 bytes 
       4 Dir(s) 11 576 438 784 bytes free 

D:\temp\1>rmdir Rún 

D:\temp\1>dir 
Volume in drive D has no label. 
Volume Serial Number is 8C33-61BF 

Directory of D:\temp\1 

02.02.2010 09:56 <DIR>   . 
02.02.2010 09:56 <DIR>   .. 
02.02.2010 09:32    508 1.txt 
02.02.2010 09:28    12 delete.bat 
02.02.2010 09:20    95 delete.cmd 
02.02.2010 09:13 <DIR>   Гуцул Каліпсо 
       3 File(s)   615 bytes 
       3 Dir(s) 11 576 438 784 bytes free 

Sau đó, tôi đặt cùng một lệnh rmdir lệnh trong tập lệnh theo lô và lưu mã đó vào mã hóa UTF-8. Nhưng khi tôi chạy không có gì xảy ra, nghĩa đen không có gì: thậm chí không echo làm việc từ tập lệnh batch trong trường hợp này. Ngay cả việc lưu tập lệnh trong mã hóa OEM cũng không giúp được gì.

Vì vậy, có vẻ như khi tôi thay đổi mã hóa thành UTF-8 trong bảng điều khiển, các tập lệnh chỉ dừng hoạt động. Có ai biết cách sửa lỗi đó không?

+0

Cân nhắc và viết câu trả lời thực tế sớm, nhưng có hai câu hỏi: Bạn có chắc chắn rằng tệp lô của bạn không có U + FEFF khi bắt đầu? Và bạn có thể sử dụng VBScript có lẽ thay vì một tập tin thực thi? Hỗ trợ Unicode dễ dàng hơn nhiều ở đó. – Joey

+0

không, không có BOM trong tập tin thực thi. Tôi có thể sử dụng VBS, nhưng tôi chỉ muốn biết nếu vấn đề của tôi có thể được giải quyết trực tiếp. – Andy

+0

Có thể nó có thể; Tôi đã thực hiện một số tiến bộ trong khi trước đây với Unicode trong các tập tin batch, nhưng nó không có nghĩa là đẹp và nó đã được patchy lúc tốt nhất. – Joey

Trả lời

8

Nếu bạn muốn có unicode được hỗ trợ trong tập tin thực thi, sau đó CHCP trên một dòng của chính nó chỉ hủy bỏ các tập tin thực thi. Những gì tôi đề nghị là đưa CHCP trên mỗi dòng tập tin thực thi mà cần unicode như sau

chcp 65001 > nul && <real command here> 

Ví dụ: Trong trường hợp của tôi, tôi muốn có một TAIL tốt đẹp của các file log của tôi trong khi gỡ lỗi, nhưng nội dung cho thậm chí Latin-1 nhân vật đã bị rối tung lên. Vì vậy, đây là tập tin batch của tôi mà kết thúc tốt đẹp việc thực hiện đuôi thực từ Windows Resource Kit.

@C:\WINDOWS\system32\chcp.com 65001 >nul && tail.exe -f %1 

Ngoài ra, để xuất ra bàn điều khiển, bạn cần đặt phông chữ loại thực, tức là Lucidia Console.

Và rõ ràng cho đầu ra vào một tập tin dòng lệnh cần chạy như Unicode, do đó bạn sẽ khởi kịch bản hàng loạt của bạn như sau

cmd /u /c <batch file command here> 

Disclaimer: Thử nghiệm trên Windows XP sp3 với Windows Resource Kit.

+0

Sau đó có thể 'chcp 65001 && path \ to \ batchfile.bat' cũng sẽ công việc? – tripleee

0

Hỗ trợ Unicode trong bảng điều khiển và đặc biệt là trong tệp hàng loạt, khá kém. Bạn có thể "xoay" yêu cầu để nói PowerShell hoặc Active Scripting (VBScript hoặc JScript) không?

Nó sẽ giúp bạn tiết kiệm rất nhiều nỗi đau trong thời gian dài (nếu bạn cần để phát triển này ngoài nhiệm vụ đơn giản này)

Chưa kể rằng cả hai PowerShell và ActiveScripting sử dụng ngôn ngữ cách mạnh mẽ hơn, cho phép chức năng, các vòng lặp thích hợp, các biến thực, trình gỡ lỗi, rất nhiều tính năng cho một dự án nghiêm túc hơn.

+0

Có, tôi có thể. Tôi chỉ muốn tìm ra, là nó có thể giải quyết lỗi này (thực sự, đó là một lỗi, không phải là nó) một cách trực tiếp ... – Andy

0

Hãy thử chèn một dòng trống như dòng đầu tiên trong tập tin thực thi của bạn ...

Dòng 1:

Dòng 2: CHCP 65001

Dòng 3: kịch bản commmands

Nên hoạt động !

+0

Xin lỗi, tôi quên: Đảm bảo tệp BAT được lưu dưới dạng UTF-8 –

+0

Tại sao công việc này nên hoạt động? Vui lòng mở rộng bằng cách thêm các trường hợp kiểm tra, nếu có thể. – adamdunson

+0

Với Win7 công trình này, nhưng sau đó bạn không có bất kỳ vấn đề với chcp 65001, có hoặc không có một dòng sản phẩm nào. Với XP, điều này vẫn không thành công. – jeb

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