Вход | Регистрация



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

Проблема с кодировкой лог-файла 1С в bat-файле
Я
   Cube
 
05.01.13 - 07:16
Всю голову уже сломал...
Простой батник:

@echo off

set ConnectionString=/F "D:\1CBases\v82\Моя база" /N "Логин" /P "Пароль"
set ArchivePath=D:\1CBases\v82\Моя база\Архив

"C:\Program Files\1cv82\8.2.17.143\bin\1cv8.exe" DESIGNER %ConnectionString% /DumpIB "%ArchivePath%\1Cv8.dt" /Out "%ArchivePath%\Лог.txt"
type "%ArchivePath%\Лог.txt"

pause


Вместо великого могучего выводит крякозяблы! Как вывести текст лог-файла в нормальной кодировке?
Весь инет перерыл, не могу победить...
Пробовал даже так: http://ab57.ru/cmd.html#id15 но во втором файле, почему то, только одна строка - путь до первого файла...

Помогите победить, не прибегая к внешним библиотекам.
 
 
   Cube
 
1 - 05.01.13 - 07:19
Ах да, в лог-файле 1С кодировка ANSI (1251), а в батнике кодировка DOS (866).
   Aleksey
 
2 - 05.01.13 - 07:20
а зачем его смотреть в бантике? Открой в блакноте
   Противный
 
3 - 05.01.13 - 07:20
перевести "на великий могучий латинский алфавит" не судьба?
   Aleksey
 
4 - 05.01.13 - 07:22
(3) кого перевести? Научить 1С писать логи транслитом? Исходниками не поделишься, чтобы код платформы поправить?
   Cube
 
5 - 05.01.13 - 07:22
(2) Лог-файл выводит полезную инфу об открытых сессиях, я хочу сделать бесконечный цикл в батнике, чтобы он показывал, кто блокирует базу, если нельзя сделать архивную копию.
   Cube
 
6 - 05.01.13 - 07:23
(3) Ты, видимо, не понял, о чем речь)
   Aleksey
 
7 - 05.01.13 - 07:24
(5) Ну так и показывай в блокноте?
вместо type напиши notepad (или что там у тебя в винде)

Или я несовсем понял кому ты эту инфу выводишь?
   rphosts
 
8 - 05.01.13 - 07:26
(0) ну напиши перекодировщик своих текстовых файлов, делов0то...
   Cube
 
9 - 05.01.13 - 07:26
(7) Понимаешь, это кусок батника, поэтому нужно выводить инфу в этом же окне, а не открывать новые окна.

"кому ты эту инфу выводишь?" - тому, кто будет делать архивную копию. Запустил батник, а тебе в лицо: "Не могу сделать архив, Ива Иваныч, волк тряпошный, из базы не вышел")))
   Cube
 
10 - 05.01.13 - 07:27
(8) Не получается... Помоги?)
 
 Рекламное место пустует
   rphosts
 
11 - 05.01.13 - 07:31
(10) с сишняком/паскалем знаком?
   rphosts
 
12 - 05.01.13 - 07:32
а хотя нафига! ну например http://www.softholm.com/download-software-free9813.htm
   Cube
 
13 - 05.01.13 - 07:32
(11) Можно сказать, что уже нет))) Но зачем они тут? Ты хочешь внешнюю прогу наваять?
   Aleksey
 
14 - 05.01.13 - 07:33
   Cube
 
15 - 05.01.13 - 07:33
(12) (14) В (0) написано: "не прибегая к внешним библиотекам"
   Aleksey
 
16 - 05.01.13 - 07:35
(15) Ну ты же сам просил помощи в написания конвертора?
iconv -f windows-1251 -t cp866 input.txt > output.tx
   Cube
 
17 - 05.01.13 - 07:36
(16) Мне не нужно писать конвертор, мне нужно сконвертировать файл средствами батника без внешних компонент. Или вывести инфу из файла в читаемом виде.
   rphosts
 
18 - 05.01.13 - 07:40
(17) а разве куций язык пакетных файлов умеет организовывать циклы и пилить строку? Вроде как нет - значит и решения нет...
   Cube
 
19 - 05.01.13 - 07:41
(18) По ссылке в (0) ходил? Как-то можно, но у меня не получается что-то...
   rphosts
 
20 - 05.01.13 - 07:42
а хотя.... имем 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
   Aleksey
 
21 - 05.01.13 - 07:44
(18) Он много что может

Куцыф он только в хелпе
   Cube
 
22 - 05.01.13 - 07:46
(20) Пробовал? А я пробовал:

@echo off

set ConnectionString=/F "D:\1CBases\v82\Моя база" /N "Логин" /P "Пароль"
set ArchivePath=D:\1CBases\v82\Моя база\Архив

"C:\Program Files\1cv82\8.2.17.143\bin\1cv8.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


Во втором файле только одна строка - путь до первого файла.
   Aleksey
 
23 - 05.01.13 - 07:47
(22) Логично что одна строка, у тебя же цикл не отрабатывает до конца
   Cube
 
24 - 05.01.13 - 07:48
(23) Где ошибка, подскажи?
   rphosts
 
25 - 05.01.13 - 07:52
(24) возврат есть?
   rphosts
 
26 - 05.01.13 - 07:52
или вместо него пауза?
   Cube
 
27 - 05.01.13 - 07:55
(25) (26) добавил строку "exit /b" куда надо, но результат тот же... В файле Лог_866.txt только путь до первого файла...
Думаю, что проблема в том, что я путь до первого файла указываю как строку и он её хавать не хочет...
   Aleksey
 
28 - 05.01.13 - 07:59
(27)  Да там полно ошибок
   Aleksey
 
29 - 05.01.13 - 08:02
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
   Cube
 
30 - 05.01.13 - 08:02
(28) Пинай сильнее, не стесняйся))) Укажи на ошибки, плиз.
   Aleksey
 
31 - 05.01.13 - 08:02
(30) Готово :)
   Aleksey
 
32 - 05.01.13 - 08:05
А ну да, после твоих манипуляций у тебя будет кодировка 1251 для вывода, поэтому нужно

chcp 866 >nul

и после этого уже можно выводить

more %ArchivePath%\Лог_866.txt

more а не type - это чисто из моих эстетических соображений. Разница лишь в том что type выводит всю партянку, а more как только экран будет заполнен, он будет ждать нажатия кнопки и тогда следующую порцию выведет

P.S. Это уже учтено в (29)
   Aleksey
 
33 - 05.01.13 - 08:05
А еще косяк, забыл про exit/b , кго нужно перед :End вставить
 
 
   Cube
 
34 - 05.01.13 - 08:06
(29) "Почему во второй строке ковычки "%ArchivePath%\Лог.txt" - ты же не строку передаешь, а пусть к файлу, вот и пиши просто без ковычек"
Потому что путь до лога содержит пробелы. Без кавычек не взлетит.
   Aleksey
 
35 - 05.01.13 - 08:07
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
   Aleksey
 
36 - 05.01.13 - 08:07
(34) Должно взлететь, ты же как параметр передаешь %ArchivePath%
   Cube
 
37 - 05.01.13 - 08:09
(36) Не взлетает. Говорит, что не может получить доступ к файлу "D:\1CBases\v82\Моя"...
А с кавчками он мне во второй файл пишет путь до файла 1 несколько раз подряд...
   Aleksey
 
38 - 05.01.13 - 08:11
(37) Не несколько раз, а ты просто дописываешь в конце

Вначале пропиши
if exist "%ArchivePath%\Лог.txt" (del "%ArchivePath%\Лог.txt" /f /q)
   Aleksey
 
39 - 05.01.13 - 08:12
И в начале замени
set ArchivePath=D:\1CBases\v82\Моя база\Архив

на

set ArchivePath="D:\1CBases\v82\Моя база\Архив"

И попробуй еще раз
   Cube
 
40 - 05.01.13 - 08:14
(39) Не взлетит, пробовал уже. Скажет, что не нашел файл D:\1CBases\v82\Моя база\Архив"\Лог.txt (кавычка в пути)
   rphosts
 
41 - 05.01.13 - 08:24
ну так чё, не победили ещё?
   Cube
 
42 - 05.01.13 - 08:24
(41) Неа...
   rphosts
 
43 - 05.01.13 - 08:25
(22) а ты скопируй, тупо скопируй из (20) - перекодирует весь исходный файл - проверял!!!
   Cube
 
44 - 05.01.13 - 08:26
(43) Я верю, что код рабочий, только в моем случае, путь до файлов может содержать русские символы и пробелы... Вот в этом-то и проблема...
   rphosts
 
45 - 05.01.13 - 08:29
(44) а если путь скормить как параметр батнику? а вывод в некий фиксированный файл а в конце батника исходный мочим, резльтирующий копируем куда надо
   Cube
 
46 - 05.01.13 - 08:30
(45) А где размещать фиксированный файл? В корень диска не положишь - неизвестно, есть туда у юзера доступ или нет, а в темп - так там в пути тоже русские символы и пробелы могут быть...
   Cube
 
47 - 05.01.13 - 08:31
+(46) Я уж подумал о команде cd, но хз на сколько она поможет...
   rphosts
 
48 - 05.01.13 - 08:39
например основной каталог юзера, вроде такой:  %HOMEPATH%
   Aleksey
 
49 - 05.01.13 - 08:40
(40) Удали пробелы, так как он считает что все что в ковычках строка
 
 Рекламное место пустует
   Aleksey
 
50 - 05.01.13 - 08:41
А он вообще "Моя база" находит? Там же кодировки разные?
   rphosts
 
51 - 05.01.13 - 08:41
(49) кста, а разве в имена файлов/папок можно всякие куавычки пихать?
   Cube
 
52 - 05.01.13 - 08:41
(48) Русские символы и пробелы могут быть и там...
   Cube
 
53 - 05.01.13 - 08:42
(49) В смысле удалить кавычки?
   Aleksey
 
54 - 05.01.13 - 08:42
(51) В мена нет, поэтому обычно и передают в виде строки
   rphosts
 
55 - 05.01.13 - 08:42
(52) передавай полный путь+имя как параметр на вход пакетному файлу
   Cube
 
56 - 05.01.13 - 08:42
(50) Находит...
   Aleksey
 
57 - 05.01.13 - 08:42
(53) Параметры у For таки
без ковычек - путь
с ковычками - строка
одинарные ковычки - команда
   Aleksey
 
58 - 05.01.13 - 08:43
(55) Из-за пробела не взлетит. Потому что в досе пробел - разделитель команд
   Cube
 
59 - 05.01.13 - 08:43
(55) Не понял...
   Cube
 
60 - 05.01.13 - 08:43
(57) (58) И что делать-то?
   rphosts
 
61 - 05.01.13 - 08:44
(54) т.о. это кривая папка или файл и не может считаться корректным для теста
   Cube
 
62 - 05.01.13 - 08:46
(61) И что делать-то?)
   rphosts
 
63 - 05.01.13 - 08:46
(59) KruchuVerchuKodyZaputatHochu.bat "D:\1CBases\v82\Моя"

а внути него вместо переданного уже как параметр имени юзать %1
   Aleksey
 
64 - 05.01.13 - 08:47
(63) Не взлетит
   Cube
 
65 - 05.01.13 - 08:48
(63) Что-то мне подсказывает, что это не решение проблемы...
   Aleksey
 
66 - 05.01.13 - 08:48
И кстати не уверен, что
set ArchivePath=D:\1CBases\v82\Моя база\Архив

нормально отработает в досе
   Cube
 
67 - 05.01.13 - 08:49
(66) Код из (0) работает без ошибок.
   rphosts
 
68 - 05.01.13 - 08:50
(64) обоснуй
   Aleksey
 
69 - 05.01.13 - 08:51
(67) ТОгда как вариант переименуй bat в cmd и попробуй запустить
   rphosts
 
70 - 05.01.13 - 08:52
(69)чем бат-то не правится?
   Aleksey
 
71 - 05.01.13 - 08:52
(68) потому что он подставит результат и попытается выполнить. И обломается
   Aleksey
 
72 - 05.01.13 - 08:52
(70) Есть мнение, что разные интерпритаторы команд, и по разному работают
   Cube
 
73 - 05.01.13 - 08:53
(69) Не помогло.
   Aleksey
 
74 - 05.01.13 - 08:54
(3) Ну хз у меня работает

Ты точно убрал ковычки?
   Aleksey
 
75 - 05.01.13 - 08:54
текст в студию
   Cube
 
76 - 05.01.13 - 08:55
(74) Не, кавычки не убирал))) Ща попробую)
   Cube
 
77 - 05.01.13 - 08:58
(74) cmd-файл:

@echo off

set ConnectionString=/F "D:\1CBases\v82\Моя база" /N "Логин" /P "Пароль"
set ArchivePath=D:\1CBases\v82\Моя база\Архив

"C:\Program Files\1cv82\8.2.17.143\bin\1cv8.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:\1CBases\v82\Моя"...
   rphosts
 
78 - 05.01.13 - 09:00
(77) имя+ путь, логнэём и пароль передавать как входные параметры
   Cube
 
79 - 05.01.13 - 09:03
(78) Лог-файл создается без проблем. Ошибка возникает после этого.
   Cube
 
80 - 05.01.13 - 09:12
Пробую так:

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...
   Aleksey
 
81 - 05.01.13 - 09:14
(80) Ошибка какая?
   Aleksey
 
82 - 05.01.13 - 09:16
В начале почему не добавил
if exist "%ArchivePath%\Лог_866.txt" (del "%ArchivePath%\Лог_866.txt" /f /q)

ну и

if exist Лог_866.txt more Лог_866.txt
   Cube
 
83 - 05.01.13 - 09:17
(80) Если файла Лог_866.txt нет, то ошибка в крякозяблах про файл Лог.txt и ещё одна ошибка "Не удается получить доступ к файлу D:\1CBases\v82\Моя база\Архив\Лог_866.txt"
   Cube
 
84 - 05.01.13 - 09:18
(82) Я все файлы вручную удаляю перед запуском. Так что, пока, не критично.
   Aleksey
 
85 - 05.01.13 - 09:18
(83) Замени Лог_866.txt на Log_866.txt
И это плохой тон писать в бантике по русски
   Cube
 
86 - 05.01.13 - 09:21
(85) Ахахахахах!!!!!! О, дааааааааааааааааа!!!!!
Работает!)))) Тынц-тынц))))
Ща, наведу марафет и выложу, что получилось)
   rphosts
 
87 - 05.01.13 - 09:30
(86) марафет это ваще-то по фене укол опия! Ты там кодишь за дозу?
   Aleksey
 
88 - 05.01.13 - 09:33
(87) Наводить/ навести марафет.
1. Жарг. угол. Привести в замешательство неожиданным вопросом случайного свидетеля кражи и скрыться с места преступления. Трахтенберг, 37.
2. Жарг. угол. Заверять кого-л. в своей невинности, честности. СРВС 2, 51, 55, 189; СРВС 3, 102.
3. Кубан. Дурачить, обманывать кого-л. СРНГ 17, 369.
4. Прост. Приводить себя или что-л. в полный порядок (по случаю праздника, торжественной встречи кого-л. и т. п.). БМС 1998, 366; НЗС-84, 344; Глухов 1988, 87; Грачев, Мокиенко 2000, 118; Вахитов 2003, 104.

(с) http://dic.academic.ru/dic.nsf/proverbs/4994/МАРАФЕТ
   Cube
 
89 - 05.01.13 - 09:37
(87) (88) Имеется ввиду
"4. Прост. Приводить себя или что-л. в полный порядок (по случаю праздника, торжественной встречи кого-л. и т. п.). БМС 1998, 366; НЗС-84, 344; Глухов"
Не надо тут мне... :)))
Блин, жена в магаз гонит, марафет наведу минут через 20... :)
   rphosts
 
90 - 05.01.13 - 09:39
(89) не, ну ты код когда покажешь?
   Cube
 
91 - 05.01.13 - 09:43
(90) Ладно, вот что успел набросать:

@echo off

set ConnectionString=/F "D:\+\1CBases\v82\Домашняя бухгалтерия" /N "Администратор" /P "0"
cd /d "D:\+\1CBases\v82\Домашняя бухгалтерия\Архив"

:StartPoint
echo %date% %time:~0,8% - Создание архивной копии...
"C:\Program Files\1cv82\8.2.17.143\bin\1cv8.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 и если в файле есть строка "Выгрузка информационной базы успешно завершена", то в условие не заходить... Поможете?)
   Cube
 
92 - 05.01.13 - 09:44
(91) Ну вот, вывалил имя своей базы, логин и пароль))))))))) Эх)))
   rphosts
 
93 - 05.01.13 - 09:44
(91) день прожит не зря?
   Aleksey
 
94 - 05.01.13 - 09:53
ping 127.0.0.1 -n 5 > nul
Замени на

choice /C Y /T 5 /D Y /M "Продолжить?"
   Aleksey
 
95 - 05.01.13 - 10:06
Нужно в строке "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
)
   Cube
 
96 - 05.01.13 - 10:20
(94) Вещь! Спасибо)
(95) Угу, я уже был близок к этому коду, но спасибо, что подсказал))

Итак, вот он, мой bat-файл, который либо делает архивную копию, либо показывает активные сеансы (продолжая делать попытки создать архивную копию):

@echo off

set ConnectionString=/F "D:\1CBases\v82\Моя база" /N "Логин" /P "Пароль"
cd /d ArchivePath=D:\1CBases\v82\Моя база\Архив

:StartPoint
echo %date% %time:~0,8% - Создание архивной копии...
"C:\Program Files\1cv82\8.2.17.143\bin\1cv8.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
   Cube
 
97 - 05.01.13 - 10:24
Aleksey и rphosts спасибо большое)


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует