Проблема с кодировкой лог-файла 1С в bat-файле #646240


#0 by Cube
Всю голову уже сломал... Простой батник: @echo off set ConnectionString=/F "D:1CBasesv82Моя база" /N "Логин" /P "Пароль" set ArchivePath=D:1CBasesv82Моя базаАрхив "C:Program Files1cv828.2.17.143in1cv8.exe" DESIGNER %ConnectionString% /DumpIB "%ArchivePath%1Cv8.dt" /Out "%ArchivePath%Лог.txt" type "%ArchivePath%Лог.txt" pause Вместо великого могучего выводит крякозяблы! Как вывести текст лог-файла в нормальной кодировке? Весь инет перерыл, не могу победить... Пробовал даже так: но во втором файле, почему то, только одна строка - путь до первого файла... Помогите победить, не прибегая к внешним библиотекам.
#1 by Cube
Ах да, в лог-файле 1С кодировка ANSI (1251), а в батнике кодировка DOS .
#2 by Aleksey
а зачем его смотреть в бантике? Открой в блакноте
#3 by Противный
перевести "на великий могучий латинский алфавит" не судьба?
#4 by Aleksey
кого перевести? Научить 1С писать логи транслитом? Исходниками не поделишься, чтобы код платформы поправить?
#5 by Cube
Лог-файл выводит полезную инфу об открытых сессиях, я хочу сделать бесконечный цикл в батнике, чтобы он показывал, кто блокирует базу, если нельзя сделать архивную копию.
#6 by Cube
Ты, видимо, не понял, о чем речь)
#7 by Aleksey
Ну так и показывай в блокноте? вместо type напиши notepad (или что там у тебя в винде) Или я несовсем понял кому ты эту инфу выводишь?
#8 by rphosts
ну напиши перекодировщик своих текстовых файлов, делов0то...
#9 by Cube
Понимаешь, это кусок батника, поэтому нужно выводить инфу в этом же окне, а не открывать новые окна. "кому ты эту инфу выводишь?" - тому, кто будет делать архивную копию. Запустил батник, а тебе в лицо: "Не могу сделать архив, Ива Иваныч, волк тряпошный, из базы не вышел")))
#10 by Cube
Не получается... Помоги?)
#11 by rphosts
с сишняком/паскалем знаком?
#12 by rphosts
а хотя нафига! ну например
#13 by Cube
Можно сказать, что уже нет))) Но зачем они тут? Ты хочешь внешнюю прогу наваять?
#14 by Aleksey
#15 by Cube
В написано: "не прибегая к внешним библиотекам"
#16 by Aleksey
Ну ты же сам просил помощи в написания конвертора? iconv -f windows-1251 -t cp866 input.txt > output.tx
#17 by Cube
Мне не нужно писать конвертор, мне нужно сконвертировать файл средствами батника без внешних компонент. Или вывести инфу из файла в читаемом виде.
#18 by rphosts
а разве куций язык пакетных файлов умеет организовывать циклы и пилить строку? Вроде как нет - значит и решения нет...
#19 by Cube
По ссылке в ходил? Как-то можно, но у меня не получается что-то...
#20 by rphosts
а хотя.... имем 866.тхт -> 1251.тхт @echo off chcp 866 >nul for /f "tokens=*" %%i in (866.txt) do call:to1251 "%%i" exit :to1251 chcp 1251 >nul echo %~1 >>1251.txt chcp 866 >nul exit /b
#21 by Aleksey
Он много что может Куцыф он только в хелпе
#22 by Cube
Пробовал? А я пробовал: @echo off set ConnectionString=/F "D:1CBasesv82Моя база" /N "Логин" /P "Пароль" set ArchivePath=D:1CBasesv82Моя базаАрхив "C:Program Files1cv828.2.17.143in1cv8.exe" DESIGNER %ConnectionString% /DumpIB "%ArchivePath%1Cv8.dt" /Out "%ArchivePath%Лог.txt" chcp 1251 >nul for /f "tokens=*" %%i in ("%ArchivePath%Лог.txt") do call:to866 "%%i" exit :to866 chcp 866 >nul echo %~1 >>"%ArchivePath%Лог_866.txt" chcp 1251 >nul type "%ArchivePath%Лог_866.txt" pause Во втором файле только одна строка - путь до первого файла.
#23 by Aleksey
Логично что одна строка, у тебя же цикл не отрабатывает до конца
#24 by Cube
Где ошибка, подскажи?
#25 by rphosts
возврат есть?
#26 by rphosts
или вместо него пауза?
#27 by Cube
добавил строку "exit /b" куда надо, но результат тот же... В файле Лог_866.txt только путь до первого файла... Думаю, что проблема в том, что я путь до первого файла указываю как строку и он её хавать не хочет...
#28 by Aleksey
Да там полно ошибок
#29 by Aleksey
1. chcp 1251 >nul 2. for /f "tokens=*" %%i in ("%ArchivePath%Лог.txt") do call:to866 "%%i" 3. exit 4. :to866 5. chcp 866 >nul 6. echo %~1 >>"%ArchivePath%Лог_866.txt" 7. chcp 1251 >nul 8. type "%ArchivePath%Лог_866.txt" 9. pause Почему во второй строке ковычки "%ArchivePath%Лог.txt" - ты же не строку передаешь, а пусть к файлу, вот и пиши просто без ковычек Третью строку заменить на Goto :End. Тебе же дальше надо выполнять, а не закрывать Вместо 8 строки нужно :End chcp 866 >nul more %ArchivePath%Лог_866.txt
#30 by Cube
Пинай сильнее, не стесняйся))) Укажи на ошибки, плиз.
#31 by Aleksey
Готово :)
#32 by Aleksey
А ну да, после твоих манипуляций у тебя будет кодировка 1251 для вывода, поэтому нужно chcp 866 >nul и после этого уже можно выводить more %ArchivePath%Лог_866.txt more а не type - это чисто из моих эстетических соображений. Разница лишь в том что type выводит всю партянку, а more как только экран будет заполнен, он будет ждать нажатия кнопки и тогда следующую порцию выведет P.S. Это уже учтено в
#33 by Aleksey
А еще косяк, забыл про exit/b , кго нужно перед :End вставить
#34 by Cube
"Почему во второй строке ковычки "%ArchivePath%Лог.txt" - ты же не строку передаешь, а пусть к файлу, вот и пиши просто без ковычек" Потому что путь до лога содержит пробелы. Без кавычек не взлетит.
#35 by Aleksey
chcp 1251 >nul for /f "tokens=*" %%i in ("%ArchivePath%Лог.txt") do call:to866 "%%i" Goto :End :to866 chcp 866 >nul echo %~1 >>"%ArchivePath%Лог_866.txt" chcp 1251 >nul exit/b :End chcp 866 >nul more %ArchivePath%Лог_866.txt pause
#36 by Aleksey
Должно взлететь, ты же как параметр передаешь %ArchivePath%
#37 by Cube
Не взлетает. Говорит, что не может получить доступ к файлу "D:1CBasesv82Моя"... А с кавчками он мне во второй файл пишет путь до файла 1 несколько раз подряд...
#38 by Aleksey
Не несколько раз, а ты просто дописываешь в конце Вначале пропиши if exist "%ArchivePath%Лог.txt" (del "%ArchivePath%Лог.txt" /f /q)
#39 by Aleksey
И в начале замени set ArchivePath=D:1CBasesv82Моя базаАрхив на set ArchivePath="D:1CBasesv82Моя базаАрхив" И попробуй еще раз
#40 by Cube
Не взлетит, пробовал уже. Скажет, что не нашел файл D:1CBasesv82Моя базаАрхив"Лог.txt (кавычка в пути)
#41 by rphosts
ну так чё, не победили ещё?
#42 by Cube
Неа...
#43 by rphosts
а ты скопируй, тупо скопируй из - перекодирует весь исходный файл - проверял!!!
#44 by Cube
Я верю, что код рабочий, только в моем случае, путь до файлов может содержать русские символы и пробелы... Вот в этом-то и проблема...
#45 by rphosts
а если путь скормить как параметр батнику? а вывод в некий фиксированный файл а в конце батника исходный мочим, резльтирующий копируем куда надо
#46 by Cube
А где размещать фиксированный файл? В корень диска не положишь - неизвестно, есть туда у юзера доступ или нет, а в темп - так там в пути тоже русские символы и пробелы могут быть...
#47 by Cube
+ Я уж подумал о команде cd, но хз на сколько она поможет...
#48 by rphosts
например основной каталог юзера, вроде такой:  %HOMEPATH%
#49 by Aleksey
Удали пробелы, так как он считает что все что в ковычках строка
#50 by Aleksey
А он вообще "Моя база" находит? Там же кодировки разные?
#51 by rphosts
кста, а разве в имена файлов/папок можно всякие куавычки пихать?
#52 by Cube
Русские символы и пробелы могут быть и там...
#53 by Cube
В смысле удалить кавычки?
#54 by Aleksey
В мена нет, поэтому обычно и передают в виде строки
#55 by rphosts
передавай полный путь+имя как параметр на вход пакетному файлу
#56 by Cube
Находит...
#57 by Aleksey
Параметры у For таки без ковычек - путь с ковычками - строка одинарные ковычки - команда
#58 by Aleksey
Из-за пробела не взлетит. Потому что в досе пробел - разделитель команд
#59 by Cube
Не понял...
#60 by Cube
И что делать-то?
#61 by rphosts
т.о. это кривая папка или файл и не может считаться корректным для теста
#62 by Cube
И что делать-то?)
#63 by rphosts
KruchuVerchuKodyZaputatHochu.bat "D:1CBasesv82Моя" а внути него вместо переданного уже как параметр имени юзать %1
#64 by Aleksey
Не взлетит
#65 by Cube
Что-то мне подсказывает, что это не решение проблемы...
#66 by Aleksey
И кстати не уверен, что set ArchivePath=D:1CBasesv82Моя базаАрхив нормально отработает в досе
#67 by Cube
Код из работает без ошибок.
#68 by rphosts
обоснуй
#69 by Aleksey
ТОгда как вариант переименуй bat в cmd и попробуй запустить
#70 by rphosts
чем бат-то не правится?
#71 by Aleksey
потому что он подставит результат и попытается выполнить. И обломается
#72 by Aleksey
Есть мнение, что разные интерпритаторы команд, и по разному работают
#73 by Cube
Не помогло.
#74 by Aleksey
Ну хз у меня работает Ты точно убрал ковычки?
#75 by Aleksey
текст в студию
#76 by Cube
Не, кавычки не убирал))) Ща попробую)
#77 by Cube
cmd-файл: @echo off set ConnectionString=/F "D:1CBasesv82Моя база" /N "Логин" /P "Пароль" set ArchivePath=D:1CBasesv82Моя базаАрхив "C:Program Files1cv828.2.17.143in1cv8.exe" DESIGNER %ConnectionString% /DumpIB "%ArchivePath%1Cv8.dt" /Out "%ArchivePath%Лог.txt" chcp 1251 >nul for /f "tokens=*" %%i in (%ArchivePath%Лог.txt) do call:to866 "%%i" Goto :End :to866 chcp 866 >nul echo %~1 >>%ArchivePath%Лог_866.txt chcp 1251 >nul exit/b :End chcp 866 >nul more %ArchivePath%Лог_866.txt pause Не удалось получить доступ к файлу "D:1CBasesv82Моя"...
#78 by rphosts
имя+ путь, логнэём и пароль передавать как входные параметры
#79 by Cube
Лог-файл создается без проблем. Ошибка возникает после этого.
#80 by Cube
Пробую так: cd /d "%ArchivePath%" chcp 1251 >nul for /f "tokens=*" %%i in (Лог.txt) do call:to866 "%%i" Goto :End :to866 chcp 866 >nul echo %~1 >>Лог_866.txt chcp 1251 >nul exit/b :End chcp 866 >nul more Лог_866.txt pause Но если файла Лог_866.txt нет, то ошибка, а если есть, то выводит ошибку в крякозяблах про Лог_.txt...
#81 by Aleksey
Ошибка какая?
#82 by Aleksey
В начале почему не добавил if exist "%ArchivePath%Лог_866.txt" (del "%ArchivePath%Лог_866.txt" /f /q) ну и if exist Лог_866.txt more Лог_866.txt
#83 by Cube
Если файла Лог_866.txt нет, то ошибка в крякозяблах про файл Лог.txt и ещё одна ошибка "Не удается получить доступ к файлу D:1CBasesv82Моя базаАрхивЛог_866.txt"
#84 by Cube
Я все файлы вручную удаляю перед запуском. Так что, пока, не критично.
#85 by Aleksey
Замени Лог_866.txt на Log_866.txt И это плохой тон писать в бантике по русски
#86 by Cube
Ахахахахах!!!!!! О, дааааааааааааааааа!!!!! Работает!)))) Тынц-тынц)))) Ща, наведу марафет и выложу, что получилось)
#87 by rphosts
марафет это ваще-то по фене укол опия! Ты там кодишь за дозу?
#88 by Aleksey
Наводить/ навести марафет. 1. Жарг. угол. Привести в замешательство неожиданным вопросом случайного свидетеля кражи и скрыться с места преступления. Трахтенберг, 37. 2. Жарг. угол. Заверять кого-л. в своей невинности, честности. СРВС 2, 51, 55, 189; СРВС 3, 102. 3. Кубан. Дурачить, обманывать кого-л. СРНГ 17, 369. 4. Прост. Приводить себя или что-л. в полный порядок (по случаю праздника, торжественной встречи кого-л. и т. п.). БМС 1998, 366; НЗС-84, 344; Глухов 1988, 87; Грачев, Мокиенко 2000, 118; Вахитов 2003, 104. (с)
#89 by Cube
Имеется ввиду "4. Прост. Приводить себя или что-л. в полный порядок (по случаю праздника, торжественной встречи кого-л. и т. п.). БМС 1998, 366; НЗС-84, 344; Глухов" Не надо тут мне... :))) Блин, жена в магаз гонит, марафет наведу минут через 20... :)
#90 by rphosts
не, ну ты код когда покажешь?
#91 by Cube
Ладно, вот что успел набросать: @echo off set ConnectionString=/F "D:+1CBasesv82Домашняя бухгалтерия" /N "Администратор" /P "0" cd /d "D:+1CBasesv82Домашняя бухгалтерияАрхив" :StartPoint echo %date% %time:~0,8% - Создание архивной копии... "C:Program Files1cv828.2.17.143in1cv8.exe" DESIGNER %ConnectionString% /DumpIB 1Cv8.dt /Out Log.txt rem Конвертируем лог-файл в DOS кодировку if exist Log_for_cmd.txt (del Log_for_cmd.txt /f /q) chcp 1251 >nul for /f "tokens=*" %%i in (Log.txt) do call:to866 "%%i" Goto :End :to866 chcp 866 >nul echo %~1 >>Log_for_cmd.txt chcp 1251 >nul exit/b :End chcp 866 >nul rem Закончили конвертирование лог-файла в DOS кодировку if 1==1 ( type Log_for_cmd.txt ping 127.0.0.1 -n 5 > nul Cls Goto :StartPoint ) pause Нужно в строке "if 1==1 (" сделать поиск по файлу Log_for_cmd.txt и если в файле есть строка "Выгрузка информационной базы успешно завершена", то в условие не заходить... Поможете?)
#92 by Cube
Ну вот, вывалил имя своей базы, логин и пароль))))))))) Эх)))
#93 by rphosts
день прожит не зря?
#94 by Aleksey
ping 127.0.0.1 -n 5 > nul Замени на choice /C Y /T 5 /D Y /M "Продолжить?"
#95 by Aleksey
Нужно в строке "if 1==1 (" сделать поиск по файлу Log_for_cmd.txt и если в файле есть строка "Выгрузка информационной базы успешно завершена", то в условие не заходить... @find "Выгрузка информационной базы успешно завершена" Log_for_cmd.txt >nul IF not %errorlevel%==0 (  type Log_for_cmd.txt  choice /C Y /T 5 /D Y /M "Continue?"  Cls  Goto :StartPoint )
#96 by Cube
Вещь! Спасибо) Угу, я уже был близок к этому коду, но спасибо, что подсказал)) Итак, вот он, мой bat-файл, который либо делает архивную копию, либо показывает активные сеансы (продолжая делать попытки создать архивную копию): @echo off set ConnectionString=/F "D:1CBasesv82Моя база" /N "Логин" /P "Пароль" cd /d ArchivePath=D:1CBasesv82Моя базаАрхив :StartPoint echo %date% %time:~0,8% - Создание архивной копии... "C:Program Files1cv828.2.17.143in1cv8.exe" DESIGNER %ConnectionString% /DumpIB 1Cv8.dt /Out Log.txt rem Конвертируем лог-файл в DOS кодировку if exist Log_for_cmd.txt (del Log_for_cmd.txt /f /q) chcp 1251 >nul for /f "tokens=*" %%i in (Log.txt) do call:to866 "%%i" Goto :End :to866 chcp 866 >nul echo %~1 >>Log_for_cmd.txt chcp 1251 >nul exit/b :End chcp 866 >nul rem Закончили конвертирование лог-файла в DOS кодировку @find "Выгрузка информационной базы успешно завершена" Log_for_cmd.txt >nul if not %ErrorLevel%==0 ( type Log_for_cmd.txt choice /C Y /T 5 /D Y /M "Продолжить?" >nul Cls Goto :StartPoint ) echo %date% %time:~0,8% - Архивная копия успешно создана pause
#97 by Cube
и спасибо большое)
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С