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.
25
Odpowiedzi:
Ma to dwie przyczyny:
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).
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.)
uh
co
źródło
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:
Teraz, gdy otworzysz plik .bat w Visual Studio , początkowo pojawi się monit:
Będziesz chciał przeszukiwać opcje, aż dojdziesz do opcji DOS swojego języka:
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:
źródło
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:
Najpierw zapisuję go z kodowaniem UTF-8
Następnie z Unicode
I wreszcie z ANSI
źródło
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:
źródło