1

Тема: CMD/BAT: Искажение кодировки при отладке скрипта

Доброго времени суток жителям форума ! )

Пришёл к Вам вот с каким вопросом.

Из cmd файла запускаю js скрипт в консольном интерпретаторе cscript, а результаты возвращаю в лог файл.
Упёрся в то, что не могу вставить текст до запуска и после в нормальной кодировке

Вот проблемный кусок кода. Если убираю вызовы echo, то на выходе получаю нормальный текст, а если вставляю, то на выходе записи о начале и конце вставляются в нормальной кодировке, а промежуточная вставка корёжится.


...
echo Запуск скрипта >> %LOG_FILE_PATH%

cscript //nologo //U debug.js >> %LOG_FILE_PATH% 2>&1

echo Завершение скрипта >> %LOG_FILE_PATH%
...

Пробовал делать предварительную настройки chcp 1251 и chcp 65001. Не помогло.

Буду рад любым советам по исправлению ситуации и упрощению кода.

P.S В архив сложил то с чем ковыряюсь.

Post's attachments

debug.zip 1.24 kb, 10 downloads since 2018-11-15 

You don't have the permssions to download the attachments of this post.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

2

Re: CMD/BAT: Искажение кодировки при отладке скрипта

надо файл скрипта сохранить в кодировке Кирилица OEM 866.
я в notepad++ делаю это вот так:



https://s8.hostingkartinok.com/uploads/images/2018/11/c3cd8ffb23734291a00072b68734800e.jpg

3

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Александр_foxware, тоже пробовал. Не спасло.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4

Re: CMD/BAT: Искажение кодировки при отладке скрипта

По сути получается кто первый начал писать лог файл тот и задал кодировку.

Надо попробовать сначала записать:

cscript //nologo //U debug.js >> %LOG_FILE_PATH% 2>&1

посмотреть кодировку лога, а потом думать echo писать в этой кодировке

5

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Александр_foxware, согласен. У меня такое же представление о ситуации. Но пока так и не сообразил как поправить. Сейчас заметил, что к сообщению не прикрепился архив с скриптами. Исправил. Добавил в аттач.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6

Re: CMD/BAT: Искажение кодировки при отладке скрипта

cscript //nologo //U debug.js

//U - лишнее

( 2 * b ) || ! ( 2 * b )

7

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Rumata, Вот и я пробовал и с ключом //U и без него. Пока натыкаюсь на те же грабли. Если есть возможность - можете на примере моей сборки из аттача показать, как исправить ?

P.S Буду крайне благодарен.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8 (изменено: Rumata, 2018-11-15 13:17:14)

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Уберите ключ //U. Я скачал Ваши примеры и запустил debug.cmd. Результирующий лог-файл получился в смешанной кодировке. Удалил флаг и запустил еще раз. Вывод был в единой кодировке 1251, как это установлено в скрипте. В этой же кодировке написаны все скрипты -- то есть debug.cmd и debug.js написаны в кодировке 1251. И выводимый русский текст выводится правильно.

Вот что я вижу с ключом //U (не уверен, что юникод отобразится верно):


Запуск скрипта 
0?8AL  2  S t d O u t 
 
 0?8AL  2  S t d E r r 
 
 C : \ T e m p \ z z z \ d e b u g \ d e b u g . j s ( 5 ,   1 )   M i c r o s o f t   J S c r i p t   r u n t i m e   e r r o r :   O b j e c t   e x p e c t e d 
 
 
 
 Завершение скрипта 

Вот без ключа //U:


Запуск скрипта 
Запись в StdOut
Запись в StdErr
C:\Temp\zzz\debug\debug.js(5, 1) Microsoft JScript runtime error: Object expected

Завершение скрипта 
( 2 * b ) || ! ( 2 * b )

9

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Используя ключ //U Вы "ломаете" вывод js-скрипта -- он пытается писать в 1251, но шелл переводит все в юникод.

( 2 * b ) || ! ( 2 * b )

10

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Rumata, так ведь убирал.

Вот что наблюдаю при запуске скрипта без флага //U


Запуск скрипта 
Запись в StdOut
Запись в StdErr
C:\debug\debug.js(5, 1) ЋиЁЎЄ  ўлЇ®«ҐЁп Microsoft JScript: ЏаҐ¤Ї®« Ј Ґвбп  «ЁзЁҐ ®ЎкҐЄв 

Завершение скрипта 

И только добавив этот флаг, но убрав вызовы echo, я получаю


Запись в StdOut
Запись в StdErr
C:\debug\debug.js(5, 1) Ошибка выполнения Microsoft JScript: Предполагается наличие объекта

Мне в принципе всё это нужно, чтобы скрипт, который стартует на машине по заданию писал в лог информацию о своей работе и в том числе о нештатных событиях, в случае необработанного исключения (exception).

А добавку echo по концу и началу пытаюсь вставить, чтобы отделять записи в логе, созданном в течении дня. Можно было бы вставить добавку этого текста и в сам скрипт, но тогда, если произойдёт exception в самом начале скрипта (например на создании FSO или прочих объектов, которые будут создаваться в начале кода), то разделителей начала и конца уже не будет. Ммм... Надеюсь смог внятно пояснить проблемку. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon пишет:

Мне в принципе всё это нужно, чтобы скрипт, который стартует на машине по заданию писал в лог информацию о своей работе и в том числе о нештатных событиях, в случае необработанного исключения (exception).

Пусть основной скрипт и пишет заголовок о начале своей работы. Просто пара сообщений из которых мы узнаем, что он стартовал, что он сделал подготовительные работы, что он сделал/делает основную работы. А если что-то пойдет не так, то Вы быстро увидите по заголовкам наало текущей сессии.

( 2 * b ) || ! ( 2 * b )

12

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Rumata,

1) так в том то и дело, что если FSO не создался, то и записи в лог уже не кому будет делать и тогда в логе ничего не добавится кроме самой ошибки. Именно поэтому я и хочу добавку echo сделать.

2) А по вопросу проблемы с кодировкой в моей ситуации можете посоветовать что-то ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Честно признаюсь, я не могу понять почему у Вас не получается исправить проблему удалением ключа //U. У меня решается. Откажитесь от переключения кодировки в консоли. Попробуйте по другому: в основном скрипте пишите все в STDOUT/STDERR, а в батнике-запускателе делайте редирект в файл. Пусть все скрипты будут в единой кодировке (1251 или 866, последняя, кажется, по умолчанию). На крайний случай пишите по-английски: "XXX starting", "XXX done", "XXX failed: Error code=NNN". Их легко понять каждому.

( 2 * b ) || ! ( 2 * b )

14 (изменено: mozers, 2018-11-15 18:29:17)

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon,
Я бы поступил проще, оставив батник в кодировке dos866. Лог с сообщениями и ошибками (и батника и скрипта) будет вполне читабельным (только тоже в dos866).
Единственный момент - вместо WSH.StdOut.WriteLine надо использовать WSH.Echo.
Да, ключ //U - убрать.

15

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Rumata,
так в том то и беда, что даже вставка латиницы ни чем не помогает ! ) При этом я получаю всё ту же лажу с кодировкой ошибок скрипта:


Script started 
C:\Users\auto08\Desktop\js_debug\test.js(8, 1) ЋиЁЎЄ  ўлЇ®«ҐЁп Microsoft JScript: ЏаҐ¤Ї®« Ј Ґвбп  «ЁзЁҐ ®ЎкҐЄв 

Script finished 

И я буду только рад отказаться от переключения кодировки, если это возможно.
Мне вот другое интересно. В Вашем примере ошибки скрипта выдаются на английском, а у меня на русском. У вас англоязычная Windows ? Я к чему веду - у меня такая проблема на всех русскоязычным машинах, что Win 7, что Win 10.
Поэтому и бьюсь об стену этой беды.

mozers, живой примерчик скинуть можете ? )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon пишет:

В Вашем примере ошибки скрипта выдаются на английском, а у меня на русском. У вас англоязычная Windows ?

Да.

Еще один вариант. Сделайте редирект целого блока кода. Так Вы избавитесь от необходимости "редиректить" каждую команду и следить на предмет отсутствия/наличия лог-файла. Вот пример:


@echo off

set "LOGDIR=%~dp0LOGS"
set "LOGFILE=%LOGDIR%\%~n0.log"

if not exist "%LOGDIR%" mkdir "%LOGDIR%"

>"%LOGFILE%" (
	echo:Запуск скрипта
	cscript //nologo debug.js 2>&1
	echo:Завершение скрипта
)

Еще одна подсказка. Посмотрите, в какой кодировке jscript выдает свои ошибки.

( 2 * b ) || ! ( 2 * b )

17

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Rumata,

результат всё тот же:


Запуск скрипта
привет
привет
C:\Users\superuser\Desktop\test\debug.js(3, 1) ЋиЁЎЄ  ўлЇ®«ҐЁп Microsoft JScript: ЏаҐ¤Ї®« Ј Ґвбп  «ЁзЁҐ ®ЎкҐЄв 

Завершение скрипта

Еще одна подсказка. Посмотрите, в какой кодировке jscript выдает свои ошибки.

А как Вы предлагаете это сделать ? )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

18 (изменено: mozers, 2018-11-15 22:52:30)

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon,
вот рабочий пример. Винда русская (7 и 10). А, впрочем, пофиг.
WSH выдает все (echo и ошибки) в кодировке dos866 (независимо от кодировки консоли).

Post's attachments

debug.zip 1.08 kb, 2 downloads since 2018-11-15 

You don't have the permssions to download the attachments of this post.

19 (изменено: Rumata, 2018-11-15 22:43:45)

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon пишет:

А как Вы предлагаете это сделать ?

В просмотрщике ФАРа или утилита od (так od -c или так od -a) из cygwin/git-for-windows. Главное - увидеть ascii коды кириллицы, они узнаваемые.

( 2 * b ) || ! ( 2 * b )

20

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon,
еще один "более современный" вариант с выводом лога в уникоде (utf16le). Запускать через _start.cmd

Post's attachments

debug_utf16.zip 1.24 kb, 7 downloads since 2018-11-15 

You don't have the permssions to download the attachments of this post.

21

Re: CMD/BAT: Искажение кодировки при отладке скрипта

mozers, огромное спасибо ! ) То что надо ! Пойду внедрять. Крайне Вам признателен за помощь !

P.S Вчера пытался добиться результата тем же путём, но не знал про ключ /u при запуске cmd

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

22

Re: CMD/BAT: Искажение кодировки при отладке скрипта

Xameleon, да не за что (чой то зацепила меня эта темка).
Сделал 3 наглядных примера с корректным русским выводом лога в кодировках dos866, win1251, uft16le.

Разрешите еще пару малюсеньких замечаний (не по теме треда) по твоему исходному батнику:
1. if exist %LOG_FILE_PATH% del %LOG_FILE_PATH% не нужно, если в начале записи в файл поставить > а не >>.
2. Рекомендую во все батники добавлять команду pushd "%~dp0" которая позволит корректно запустить его не только из текущего каталога, а откуда угодно.

Post's attachments

russian_out.zip 3.34 kb, 5 downloads since 2018-11-16 

You don't have the permssions to download the attachments of this post.

23

Re: CMD/BAT: Искажение кодировки при отладке скрипта

mozers

1. if exist %LOG_FILE_PATH% del %LOG_FILE_PATH% не нужно, если в начале записи в файл поставить > а не >>.
2. Рекомендую во все батники добавлять команду pushd "%~dp0" которая позволит корректно запустить его не только из текущего каталога, а откуда угодно.

Да, я в курсе. Благодарю. ) Первую строчку я оставил, чтоб было удобнее комментить на момент отладки, а вторую конструкцию использую только если подразумевается запуск из сети, а так как скрипт размещается локально, решил убрать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

24

Re: CMD/BAT: Искажение кодировки при отладке скрипта

mozers пишет:

2. Рекомендую во все батники добавлять команду pushd "%~dp0" которая позволит корректно запустить его не только из текущего каталога, а откуда угодно.

Категорически не рекомендую этого делать. Чтобы можно было использовать пакетный файл в любом каталоге, а не только в том каталоге, в котором он расположен .

25

Re: CMD/BAT: Искажение кодировки при отладке скрипта

alexii
Просто надо помнить что скрипт в общем случае запускается не в том каталоге где он находится, а в том, откуда был запущен.
Соответственно все заданные в скрипте относительные пути будут отсчитываться от места запуска.
Иногда это действительно нужно, но чаще всего - нет. Поэтому надо:
- либо отказаться от использования относительных путей,
- либо в начале скрипта сменить каталог командой CD /D или PUSHD.
Так что "категорически" я бы не стал рекомендовать ничего. И то что пакетный файл будет работать в своем каталоге, никак не ограничивает его использование.

26

Re: CMD/BAT: Искажение кодировки при отладке скрипта

mozers пишет:

Иногда это действительно нужно, но чаще всего - нет.

Вот как раз с этим утверждением я и не могу согласиться, коллега.

В моём понимании пакетный файл, скрипт должны работать именно с текущим каталогом. Пакетный файл/скрипт лежит в одном, единственном месте и работает везде. Для обращения к каталогу, где содержится сам пакетный файл есть %~dp0, а для скрипта есть аналогичный механизм в виде FSO.GetParentFolderName(WScript.ScriptFullName). Мы не таскаем пакетный файл/скрипт за уши по всем каталогам — мы используем потребный каталог как текущий и указываем полный путь для запуска пакетного файла/скрипта на исполнение.