2009-04-09 25 views
6

Tôi đang gỡ lỗi một tập lệnh lệnh bó cửa sổ. Nó không thành công khi các ký tự mở rộng (> 0x7f) được sử dụng trong đường dẫn hoặc tên tệp. Vấn đề dường như có liên quan đến các tham số truyền vào một tệp lệnh được GỌI từ một tệp khác.Xử lý các ký tự mở rộng trong các lệnh Windows?

Đối với một ví dụ, lệnh này làm việc như mong đợi:

xcopy "Pezuñero\1 - 001.wav" \temp 

này không:

call another.cmd "Pezuñero" 

Nội dung "another.cmd":

xcopy "%~1\1 - 001.wav" \temp 

Các% ~ 1 cú pháp mở rộng tham số và xóa dấu ngoặc kép. Điều này là cần thiết vì trong tệp lệnh thực, các đường dẫn trong tệp lệnh gọi hoặc gọi được có thể có dấu cách.

Kết quả của ví dụ thứ hai (sao chép từ cửa sổ CMD) là thế này:

C:\>call another.cmd "Pezu±ero"  

C:\>xcopy "Pezu±ero\1 - 001.wav" \temp 
File not found - 1 - 001.wav 
0 File(s) copied 

Lưu ý rằng "N" (0xF1) nhân vật đã được thay đổi thành một "±" (0xB1).

Có ai có thể giải thích điều gì đang diễn ra và cách khắc phục sự cố này không?

Trả lời

3

Nhờ McDowell và Romulo đã chỉ cho tôi đúng hướng. Tôi nhận ra rằng tôi cần phải thay đổi ứng dụng của mình (trong Delphi) để tạo ra lô để nó sử dụng trang mã (OEM) thích hợp tương thích với bộ xử lý lệnh trong Windows. Tôi đã không tìm thấy bất cứ điều gì để chuyển đổi chuỗi mã, nhưng tôi đã phát hiện ra các chức năng Windows API SetFileApisToOEM và SetFileApisToANSI;

tôi đặt những lúc bắt đầu và kết thúc của chương trình của tôi, như thế này:

{main procedure} 
begin 
    SetFileApisToOEM; 
    {all the rest of the program} 
    SetFileApisToANSI; 
end. 

Bây giờ các tập tin batch được tạo ra với các trang mã OEM, và họ hoạt động đúng khi chạy từ một dấu nhắc CMD.

+0

Bạn cũng có thể sử dụng CharToOem để chuyển đổi các chuỗi ngay trước khi ghi chúng vào tập lệnh của bạn: http://msdn.microsoft.com/en-us/library/ms647473.aspx –

0

Bạn có thể cần phải đặt bảng mã thành mã có n với ~ ở trên cùng.

+0

Cảm ơn con trỏ tới mã hóa. Tôi đã không thực sự quen thuộc với họ - tôi đã học được rằng Windows thường sử dụng codepage 1252, nhưng cửa sổ lệnh và các tập tin batch sử dụng trang mã 437. Tôi chèn lệnh "CHCP 1252" vào lúc bắt đầu tập tin batch của tôi. Thật không may, nó không khắc phục được sự cố. – tim11g

1

Codepages là một vấn đề trong tệp hàng loạt vì chúng không được phép chứa Unicode. Cách dễ nhất để tránh vấn đề này hoàn toàn có thể là sử dụng WSH hoặc Powershell. Tôi đã không tìm thấy một workaround cho các tập tin batch cho đến nay mà thực sự phiền tôi như tôi xem xét bản thân mình một Unicode zealot :)

4

Kịch bản phải được viết bằng cùng một mã hóa cmd.exe sử dụng.

Nhập chcp tại dấu nhắc và xem những gì bạn nhận được. Sau đó mở tệp bằng trình chỉnh sửa hỗ trợ mã hóa đó. Đối với tôi chcp kết quả đầu ra codepage , vì vậy, tôi chỉnh sửa tập lệnh của mình trong JEdit chọn IBM850 làm mã hóa tệp. Tôi nhận được kết quả tương tự khi chỉnh sửa tệp trong PSPad với Định dạng được đặt thành OEM.

PS: Tôi đã kiểm tra các bước bạn trong máy tính của tôi và nhân vật ñ mà tôi viết trong notepad.exe (bằng cách sử dụng mã hóa ANSI mặc định) cũng được chuyển đổi sang một ± khi đọc từ dấu nhắc lệnh, do đó, có vẻ như máy của bạn sử dụng các mã hóa ANSI và OEM tương tự. Để chắc chắn, hãy thử thay thế ñ theo ¤ (với notepad.exe). Điều đó làm cho kịch bản hoạt động chính xác cho tôi khi chạy từ dấu nhắc lệnh (vì giá trị byte của ANSI ¤ cũng giống như của OEM ñ).

2

Tôi đã looking at character handling in cmd.exe và tôi nghĩ rằng Romulo đã chạm vào đinh trên đầu. Theo mặc định, dấu nhắc sử dụng các trang mã DOS (OEM) cũ (có thể là để tương thích với các chương trình DOS). Bạn đang viết tệp của mình bằng cách sử dụng (có thể) trang mã Windows mặc định (có thể là 1252), điều này khác nhau. Sử dụng edit.com để chỉnh sửa tệp lô.

Nếu tôi gõ chcp tại dấu nhắc, nó báo cáo các trang mã 850.

Vì vậy, ví dụ, nếu tôi sử dụng Notepad gõ này:

DIR Pezuñero 

... này được mã hóa như 1252 với các giá trị nhị phân:

     ñ 
44 49 52 20 50 65 7A 75 F1 65 72 6F 

Nếu tôi sử dụng edit để ghi các file, nó được mã hóa như 850 với các giá trị nhị phân:

     ñ 
44 49 52 20 50 65 7A 75 A4 65 72 6F 

Một điều tôi đã không nhìn được bằng cách sử dụng cmd/U chuyển đổi, nhưng tôi khá chắc chắn rằng chỉ là để xây dựng trong các lệnh shell và sẽ không giúp bạn với XCOPY.

+0

Trên thực tế, các tập tin batch được tạo ra bởi một ứng dụng. Vì vậy, câu hỏi trở nên như thế nào là bản dịch trang mã thực hiện trong một ứng dụng Win32 (Delphi 7 trong trường hợp của tôi)? Có một API Windows mà có một chuỗi trong codepage X và biến nó thành mã Y? – tim11g

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