`` '' Não é reconhecido como um comando interno ou externo

25

Ao executar determinados arquivos (principalmente em lote) usando o PsExec, recebo esses símbolos estranhos antes do meu comando. Meu pensamento inicial era que eu estava usando codificação incorreta, mas após a verificação, percebi que todos os meus arquivos estavam usando UTF-8.

miestasmia
fonte
Por que não convertê-los para UTF-16LE?
Ignacio Vazquez-Abrams
Qual é a diferença?
miestasmia
A diferença é que o Windows geralmente não usa UTF-8.
Ignacio Vazquez-Abrams

Respostas:

32

Eu recebo esses símbolos estranhos antes do meu comando […] todos os meus arquivos estavam usando UTF-8.

Isso tem duas causas:

  1. O cmd.exe não suporta UTF-8. Ele sempre usa uma das codificações de byte único, geralmente denominadas "OEM" - cp437, cp775 e assim por diante, dependendo das configurações regionais do sistema.

    (Eu esperava que ele também suporte UTF-16, mas aparentemente não; nem mesmo se eu adicionasse a lista técnica de UTF-16.)

  2. Seu editor de texto está adicionando uma "marca de ordem de bytes" UTF-8 (bytes EF BB BF) ao início de todos os arquivos UTF-8.

    Quando o cmd.exe lê o seu script, ele não sabe o que fazer com a marca - ele vê a BOM como três caracteres comuns do cp437 e tenta usá-los como parte do nome do comando.

Configure seu editor para parar de adicionar a BOM aos arquivos codificados em UTF-8. (Isso só faz sentido no UTF-16 e é muito inútil no UTF-8.)

Compilar os arquivos em lotes em um exe resolveria o problema?

uh

o que

user1686
fonte
3
Eu não diria que as listas técnicas são "muito inúteis" no UTF-8; embora estejam neste caso particular. Muitos aplicativos os utilizam para determinar se o texto é realmente UTF-8 e não outra codificação.
Dour High Arch
18

Para responder ainda mais à @ dsolimano , se você estiver usando especificamente o Visual Studio , e no meu caso é 2013 , eu a corrigi fazendo o seguinte:

  1. Abra o Visual Studio .
  2. Clique em Ferramentas > Opções .
  3. Clique em Editor de texto > Extensão de arquivo .
  4. Na caixa Extensão , digite bat .
  5. No menu suspenso Editor , selecione Editor de código-fonte (texto) com codificação e clique em Adicionar .
  6. Clique em OK para salvar e sair.

Agora, quando você abre um arquivo .bat no Visual Studio , você será solicitado inicialmente com:

insira a descrição da imagem aqui

Você desejará detalhar as opções até chegar à opção DOS do seu idioma:

insira a descrição da imagem aqui

Clique em OK para concluir a abertura do arquivo.


Ok, mesmo que deva ser bastante óbvio neste momento, se você puder ver os ∩╗┐caracteres no início do arquivo, convém removê-los e salvar o arquivo, agora com a codificação correta. É isso que impede que você seja solicitado novamente na próxima vez.


Com tudo isso, você ficará feliz em saber que agora pode exibir , editar e salvar seus arquivos .bat no Visual Studio para que o cmd.exe não for mais o erro hediondo mencionado acima:

'∩╗┐' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote.

Code Maverick
fonte
2
Essa correção funciona em VS2017 perfeitamente também
Greg Trevellick
Eu nunca teria imaginado isso. Ainda é uma solução válida para o VS2019.
hbulens 28/11
10

Essas são marcas de ordem de bytes Unicode . Cmd.exe não os entende. Se você salvar seus arquivos novamente no Bloco de Notas com codificação ANSI, isso deverá corrigir o problema.

Por exemplo, eu criei este arquivo em lotes:

echo Hello World

Primeiro eu salvo com codificação 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.

Então com 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.

E finalmente com ANSI

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

C:\Users\DSolimano\Desktop\junk>echo Hello World
Hello World
dsolimano
fonte
4

Conforme explicado anteriormente, esse caractere é o BOM de caractere unicode (Byte Order Mark) usado como uma assinatura e que o cmd.exe não reconhece.

Você pode excluí-lo com segurança de várias maneiras.

Achei muito fácil fazer o seguinte:

  1. abra o arquivo no Notepad ++
  2. vá para o menu Codificação
  3. marque a opção: Codifique em UTF-8 sem BOM
  4. Salve, e é isso.
Sabri
fonte