╗┐╗┐ nie jest rozpoznawany jako polecenie wewnętrzne ani zewnętrzne

25

Podczas wykonywania niektórych plików (głównie wsadowych) za pomocą PsExec, otrzymuję te dziwne symbole przed moim poleceniem. Początkowo myślałem, że używam niewłaściwego kodowania, ale po sprawdzeniu zdałem sobie sprawę, że wszystkie moje pliki używają UTF-8.

miestasmia
źródło
Dlaczego zamiast tego nie przekonwertować ich na UTF-16LE?
Ignacio Vazquez-Abrams
Co za różnica?
miestasmia
Różnica polega na tym, że system Windows zwykle nie używa UTF-8.
Ignacio Vazquez-Abrams

Odpowiedzi:

32

Dostaję te dziwne symbole przed moim poleceniem […] wszystkie moje pliki korzystały z UTF-8.

Ma to dwie przyczyny:

  1. cmd.exe nie obsługuje UTF-8. Zawsze używa jednego z kodowań jednobajtowych, często nazywanego „OEM” - cp437, cp775 itd., W zależności od ustawień regionalnych systemu.

    (Spodziewałem się, że będzie on również obsługiwał UTF-16, ale najwyraźniej nie; nawet jeśli dodam BOM UTF-16).

  2. Twój edytor tekstowy dodaje UTF-8 „znak kolejności bajtów” (bajty EF BB BF) na początku wszystkich plików UTF-8.

    Gdy cmd.exe odczytuje skrypt, nie wie, co zrobić ze znakiem - widzi BOM jako trzy zwykłe znaki cp437 i próbuje użyć ich jako części nazwy polecenia.

Skonfiguruj swój edytor, aby przestał dodawać BOM do plików zakodowanych w UTF-8. (Ma to sens tylko w UTF-16 i jest bardzo bezużyteczne w UTF-8.)

Czy skompilowanie plików wsadowych w plik exe rozwiązałoby problem?

uh

co

użytkownik1686
źródło
3
Nie powiedziałbym, że LM są „bardzo bezużyteczne” w UTF-8; chociaż są w tym szczególnym przypadku. Wiele aplikacji używa ich do ustalenia, że ​​tekst to UTF-8, a nie inne kodowanie.
Dour High Arch
19

Aby dodatkowo odpowiedź @ dsolimano jest , jeśli konkretnie przy użyciu Visual Studio , w moim przypadku jest to 2013 , naprawiłem go w następujący sposób:

  1. Otwórz Visual Studio .
  2. Kliknij Narzędzia > Opcje .
  3. Kliknij Edytor tekstu > Rozszerzenie pliku .
  4. W polu Rozszerzenie wpisz nietoperz .
  5. Z rozwijanego menu Edytor wybierz Edytor kodu źródłowego (tekstowego) z kodowaniem i kliknij Dodaj .
  6. Kliknij OK, aby zapisać i wyjść.

Teraz, gdy otworzysz plik .bat w Visual Studio , początkowo pojawi się monit:

wprowadź opis zdjęcia tutaj

Będziesz chciał przeszukiwać opcje, aż dojdziesz do opcji DOS swojego języka:

wprowadź opis zdjęcia tutaj

Kliknij OK, aby zakończyć otwieranie pliku.


Ok, nawet jeśli w tym momencie powinno to być dość oczywiste, jeśli widzisz ∩╗┐znaki na początku pliku, to należałoby usunąć je i zapisać plik, teraz z poprawnym kodowaniem. To uniemożliwia ponowne wyświetlenie monitu.


Z wszystkich, że w miejscu, będzie miło wiedzieć, że można teraz przeglądać , edytować i zapisz swojej .bat pliku (ów) z poziomu Visual Studio , tak aby cmd.exe nie daje wspomnianą haniebny błąd:

„∩╗┐” nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy.

Code Maverick
źródło
2
Ta poprawka działa również doskonale w VS2017
Greg Trevellick
1
Nigdy bym tego nie zgadł. Nadal aktualne rozwiązanie dla VS2019.
hbulens
10

Są to Unicode Byte Marks . Cmd.exe ich nie rozumie. Jeśli ponownie zapiszesz swoje pliki w Notatniku z kodowaniem ANSI, powinno to rozwiązać problem.

Na przykład utworzyłem ten plik wsadowy:

echo Hello World

Najpierw zapisuję go z kodowaniem 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.

Następnie z 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.

I wreszcie z ANSI

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

C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World
dsolimano
źródło
4

Jak wyjaśniono wcześniej, ten znak jest znakiem Unicode BOM (Byte Order Mark) używanym jako podpis i ten program cmd.exe nie rozpoznaje.

Możesz go bezpiecznie usunąć na wiele sposobów.

Znalazłem bardzo łatwe do wykonania w następujący sposób:

  1. otwórz plik w Notepad ++
  2. przejdź do menu Kodowanie
  3. zaznacz opcję: Zakoduj w UTF-8 bez BOM
  4. Zapisz i to wszystko.
Sabri
źródło