![Arquivo em lote simples falha no Windows Server 2012](https://rvso.com/image/1413938/Arquivo%20em%20lote%20simples%20falha%20no%20Windows%20Server%202012.png)
Em um Windows 2012 Server, a partir de um administrador logado (local e domínio), criou um arquivo em lote "test.bat" redirecionando a entrada do console para um arquivo:
echo Hello
Quando executado no prompt do cmd do PowerShell como .\test.bat
, ele ecoa:
'■e' is not recognized as an internal or external command,
O arquivo em lote está no diretório C:\users\%username% do usuário conectado.
O arquivo foi criado a partir do console, assim:
echo "echo Hello" > test.bat
e depois editado com o Bloco de Notas. Parecia bem no Bloco de Notas... nada incomum.
Alguma idéia do que está acontecendo?
EDITADO:
Por sugestão, modifiquei a entrada da linha de comando para remover aspas. Portanto, digitei o comando assim: echo echo Yowzer > test.bat
Ran as: .\test.bat
e obtive a mesma resposta acima. Observe também que se eu editar no Bloco de Notas o test.bat acima (ou seja, criado na linha cmd) e executar novamente, ele ainda retornará uma resposta lixo. No entanto, se eu criar/salvar o arquivo no Bloco de Notasdo começo,funciona corretamente.
Alguém pode duplicar isso?
Responder1
Parece que o redirecionamento >
codificou seu arquivo em lote em unicode, quando deveria ser ascii. No Powershell, use Out-File
em vez do redirecionamento assim:
"echo test" | Out-File test.bat -Encoding ascii
Executar o arquivo em lote após a seguinte codificação reproduzirá o erro:
"echo test" | Out-File test.bat -Encoding unicode
Responder2
Tive o mesmo problema, pensei que estava louco.
Faça seu arquivo em lote em outro computador. Tive o mesmo problema ao abrir o Bloco de Notas e digitar os comandos normalmente. Sempre me deu a mesma mensagem. Depois de recriar o arquivo em lote (não copie o arquivo antigo) em meu dispositivo Win7 local, copiei-o de volta para meu servidor Win 2012R2 e funcionou como um campeão.
Responder3
Você provavelmente tem algum personagem engraçado em algum lugar. Tenho certeza de que, se você fizer xxd -p blah.bat
isso, verá alguns personagens engraçados em seu arquivo em lote.
Você poderia então pensar em como eles chegaram lá e removê-los. E isso pode ser feito com xxd e sed. Ou talvez de outra forma, se você souber quais personagens eles são.
Você pode obter o xxd baixando o VIM 7.X ou do cygwin
Ou você pode encontrar um editor hexadecimal e colocar o arquivo em lote no editor hexadecimal.
Você diz que está criando o arquivo em lote a partir do stdin. Bem, você poderia explicar exatamente o que quer dizer com isso, por exemplo, você quer dizer copy con blah.bat
CTRL-Z? Mas seja lá o que você queira dizer, é colocar alguns caracteres engraçados no arquivo.
adicionado
Vejo que você afirma que fez isso com echo e redirecionamento.
Você pode simplificar isso facilmente para solucionar alguns problemas
Tentar type blah.bat
se isso mostrar um personagem engraçado, tente
echo H>blah.bat
construí-lo de acordo com o que você digitou.. e veja em que ponto você obtém o personagem engraçado.
Outra coisa para experimentar é a codificação de entrada e saída
tente chcp. chcp 850 e chcp 65001 e veja se você vê alguma diferença. chcp alterará a codificação de entrada e saída, mas chcp mostrará apenas a codificação de entrada.
Se você olhar minha resposta aquihttps://stackoverflow.com/questions/30904504/font-is-right-why-cant-i-get-this-unicode-character-to-display-in-this-c-sharp/32418703#32418703 você vê um programa chamado chcpa que escrevi há algum tempo e pode usá-lo para alterar as codificações de entrada e saída de maneira mais flexível do que o chcp. Ou você pode simplesmente usar o chcp, mas se achar que o chcp está limitando sua solução de problemas, você pode tentar o chcpa.
Mas uma de suas melhores ferramentas aqui para solução de problemas seria um editor hexadecimal ou xxd, conforme mencionado. E tentando simplificar ainda mais a sua linha, como sugerido.
Etapas como essa ajudarão você a isolar onde está o erro. E comente quando você tentar algo aqui ou mais.
Responder4
Echo não usa aspas. Retire as aspas duplas e funcionará.
echo echo hello > test.bat
Echo procura a string após echo e o espaço, as aspas quebram a string.
Mais sobreeco.