'Không được công nhận là lệnh bên trong hoặc bên ngoài


25

Khi thực thi một số tệp nhất định (chủ yếu là bó) bằng PsExec, tôi nhận được các ký hiệu lạ này trước lệnh của mình. Suy nghĩ ban đầu của tôi là, tôi đã sử dụng mã hóa sai, nhưng sau khi kiểm tra, tôi nhận ra rằng tất cả các tệp của tôi đang sử dụng UTF-8.


Tại sao không chuyển đổi chúng thành UTF-16LE thay thế?
Ignacio Vazquez-Abrams

Có gì khác biệt?
miestasmia

Sự khác biệt là Windows thường không sử dụng UTF-8.
Ignacio Vazquez-Abrams

Câu trả lời:


32

Tôi nhận được các biểu tượng 'kỳ lạ này trước khi lệnh [[]] tất cả các tệp của tôi đang sử dụng UTF-8.

Điều này có hai nguyên nhân:

  1. cmd.exe không hỗ trợ UTF-8. Nó luôn sử dụng một trong các mã hóa byte đơn thường được gọi là "OEM" - cp437, cp775, v.v., tùy thuộc vào cài đặt khu vực của hệ thống.

    (Tôi hy vọng nó cũng hỗ trợ UTF-16, nhưng dường như là không; ngay cả khi tôi đã thêm BOM UTF-16.)

  2. Trình soạn thảo văn bản của bạn đang thêm "dấu thứ tự byte" (byte EF BB BF) UTF-8 vào đầu tất cả các tệp UTF-8.

    Khi cmd.exe đọc tập lệnh của bạn, nó không biết phải làm gì với dấu - nó thấy BOM là ba ký tự cp437 thông thường và cố gắng sử dụng chúng làm một phần của tên lệnh.

Định cấu hình trình chỉnh sửa của bạn để dừng thêm BOM vào các tệp được mã hóa UTF-8. (Nó chỉ có ý nghĩa trong UTF-16, và rất vô dụng trong UTF-8.)

Sẽ biên dịch các tệp bó thành một exe giải quyết vấn đề?


3
Tôi sẽ không nói BOM là "rất vô dụng" trong UTF-8; mặc dù họ đang ở trong trường hợp cụ thể này Nhiều ứng dụng sử dụng chúng để xác định văn bản thực sự là UTF-8 chứ không phải mã hóa khác.
Dour High Arch

18

Để biết thêm câu trả lời của @ DSolimano , nếu bạn đặc biệt sử dụng Visual Studio và trong trường hợp của tôi là năm 2013 , tôi đã sửa nó bằng cách làm như sau:

  1. Mở Visual Studio .
  2. Nhấp vào Công cụ > Tùy chọn .
  3. Bấm vào Trình soạn thảo văn bản > Phần mở rộng tệp .
  4. Trong hộp mở rộng , nhập bat .
  5. Trong trình đơn thả xuống Trình chỉnh sửa, chọn Trình chỉnh sửa mã nguồn (Văn bản) có mã hóa và nhấp vào Thêm .
  6. Nhấn OK để lưu và thoát.

Bây giờ, khi bạn mở tệp .bat từ trong Visual Studio , ban đầu bạn sẽ được nhắc với:

nhập mô tả hình ảnh ở đây

Bạn sẽ muốn đi sâu vào các tùy chọn cho đến khi bạn đến với tùy chọn DOS của ngôn ngữ của bạn:

nhập mô tả hình ảnh ở đây

Nhấn OK để hoàn tất việc mở tập tin.


Ok, mặc dù nó khá rõ ràng vào thời điểm này, nếu bạn có thể nhìn thấy các ∩╗┐ký tự ở đầu tệp của mình, nó sẽ xử lý bạn loại bỏ chúng và lưu tệp, bây giờ với mã hóa chính xác. Đây là những gì ngăn cản bạn được nhắc lại lần sau.


Với tất cả điều đó tại chỗ, bạn sẽ vui mừng khi biết rằng bây giờ bạn có thể xem , chỉnh sửa , và tiết kiệm của bạn .bat file (s) từ bên trong Visual Studio để cmd.exe không còn mang đến cho bạn những lỗi ghê tởm nói trên của:

'∩╗┐' không được nhận dạng là một lệnh nội bộ hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó.


2
Bản sửa lỗi này cũng hoạt động hoàn hảo trong VS2017
Greg Trevellick

Tôi sẽ không bao giờ đoán được điều này. Vẫn là một giải pháp hợp lệ cho VS2019.
xe buýt

10

Đó là các nhãn thứ tự Unicode Byte . Cmd.exe không hiểu họ. Nếu bạn lưu lại các tệp của mình trong Notepad bằng mã hóa ANSI, điều đó sẽ khắc phục vấn đề.

Ví dụ: tôi đã tạo tệp bó này:

echo Hello World

Đầu tiên tôi lưu nó với mã hóa UTF-8

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
'echo' is not recognized as an internal or external command,
operable program or batch file.

Sau đó với Unicode

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>■e
'■e' is not recognized as an internal or external command,
operable program or batch file.

Và cuối cùng với ANSI

C:\Users\DSolimano\Desktop\junk>test.bat

C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World

4

Như đã giải thích trước đó, ký tự này là ký tự unicode BOM (Dấu thứ tự Byte) được sử dụng làm chữ ký và cmd.exe không nhận ra.

Bạn có thể xóa nó một cách an toàn theo nhiều cách.

Tôi thấy rất dễ làm như sau:

  1. mở tệp trong Notepad ++
  2. đi tới trình đơn Mã hóa
  3. đánh dấu vào tùy chọn: Mã hóa trong UTF-8 không có BOM
  4. Hãy tiết kiệm, và đó là nó.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.