![Простой пакетный файл не работает на Windows Server 2012](https://rvso.com/image/1413938/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%BD%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B0%20Windows%20Server%202012.png)
На сервере Windows 2012, войдя в систему как администратор (локальный и доменный), создал пакетный файл «test.bat», перенаправив ввод консоли в файл:
echo Hello
При запуске из командной строки PowerShell cmd в виде .\test.bat
, выводится:
'■e' is not recognized as an internal or external command,
Пакетный файл находится в каталоге C:\users\%username% вошедшего в систему пользователя.
Файл был создан из консоли, таким образом:
echo "echo Hello" > test.bat
а затем отредактировал в Блокноте. В Блокноте выглядело нормально... ничего необычного.
Есть идеи, что происходит?
ОТРЕДАКТИРОВАНО:
По предложению я изменил ввод в командной строке, чтобы удалить кавычки. Поэтому ввел команду следующим образом: echo echo Yowzer > test.bat
Ran as: .\test.bat
и получил тот же ответ, что и выше. Также обратите внимание, что если я отредактирую в блокноте указанный выше test.bat (т. е. созданный в строке cmd) и перезапущу, он все равно вернет мусорный ответ. Однако если я создам/сохраню файл в блокнотеот начала,работает правильно.
Может ли кто-нибудь это повторить?
решение1
Похоже, что перенаправление >
закодировало ваш пакетный файл в unicode, когда он должен быть ascii. В Powershell используйте Out-File
вместо перенаправления следующее:
"echo test" | Out-File test.bat -Encoding ascii
Запуск пакетного файла после следующей кодировки воспроизведет ошибку:
"echo test" | Out-File test.bat -Encoding unicode
решение2
У меня была та же проблема, я думал, что я сошел с ума.
Создайте свой пакетный файл на другом компьютере. У меня была та же проблема с открытием Блокнота и обычным вводом команд. Он всегда выдавал мне одно и то же сообщение. После того, как я заново создал пакетный файл (не копируйте старый файл) на моем локальном устройстве Win7, скопировал его обратно на мой сервер Win 2012R2, все заработало как надо.
решение3
У вас, скорее всего, где-то есть какой-то забавный персонаж. Я почти уверен, что если так, xxd -p blah.bat
то вы увидите несколько забавных персонажей в вашем пакетном файле.
Затем вы могли бы подумать, как они там оказались, и удалить их.. И это можно сделать с помощью xxd и sed. Или, возможно, другим способом, если вы знаете, какие это символы.
Вы можете получить xxd, загрузив VIM 7.X, или из cygwin
Или вы можете найти шестнадцатеричный редактор и поместить пакетный файл в него.
Вы говорите, что создаете пакетный файл из stdin.. Ну, вы могли бы уточнить, что именно вы имеете в виду, например, имеете ли вы в виду copy con blah.bat
CTRL-Z? Но что бы вы ни имели в виду, это помещает в файл какие-то странные символы.
добавлен
Я вижу, вы утверждаете, что сделали это с помощью echo и redirect.
Вы можете легко упростить это для устранения некоторых неполадок.
Пытаться type blah.bat
если там показан смешной персонаж, то попробуйте
echo H>blah.bat
развить его до того, что вы напечатали... и посмотрите, в какой момент вы получите смешного персонажа.
Еще одна вещь, с которой можно поэкспериментировать, — это кодирование входных и выходных данных.
попробуйте chcp. chcp 850 и chcp 65001 и посмотрите, увидите ли вы какие-либо различия. chcp изменит как входную, так и выходную кодировку, но chcp покажет вам только входную кодировку.
Если вы посмотрите мой ответ здесьhttps://stackoverflow.com/questions/30904504/font-is-right-why-cant-i-get-this-unicode-character-to-display-in-this-c-sharp/32418703#32418703 вы видите программу chcpa, которую я написал некоторое время назад, и вы можете использовать ее для изменения входных и выходных кодировок более гибко, чем chcp. Или вы можете просто использовать chcp, но если вы обнаружите, что chcp ограничивает вас в устранении неполадок, то вы можете попробовать chcpa.
Но одним из лучших инструментов для устранения неполадок здесь будет шестнадцатеричный редактор или xxd, как уже упоминалось. И попытка упростить вашу строку еще больше, как и предлагалось.
Такие шаги помогут вам изолировать, где находится ошибка. И комментируйте, когда вы что-то попробуете здесь или далее.
решение4
Echo не использует кавычки. Уберите двойные кавычки и все заработает.
echo echo hello > test.bat
Echo ищет строку после echo и пробела, кавычки разрывают строку.
Ещеэхо.