|
Проблема с кодировкой лог-файла 1С в bat-файле | ☑ | ||
---|---|---|---|---|
0
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 но во втором файле, почему то, только одна строка - путь до первого файла... Помогите победить, не прибегая к внешним библиотекам. |
|||
1
Cube
05.01.13
✎
07:19
|
Ах да, в лог-файле 1С кодировка ANSI (1251), а в батнике кодировка DOS (866).
|
|||
2
Aleksey
05.01.13
✎
07:20
|
а зачем его смотреть в бантике? Открой в блакноте
|
|||
3
Противный
05.01.13
✎
07:20
|
перевести "на великий могучий латинский алфавит" не судьба?
|
|||
4
Aleksey
05.01.13
✎
07:22
|
(3) кого перевести? Научить 1С писать логи транслитом? Исходниками не поделишься, чтобы код платформы поправить?
|
|||
5
Cube
05.01.13
✎
07:22
|
(2) Лог-файл выводит полезную инфу об открытых сессиях, я хочу сделать бесконечный цикл в батнике, чтобы он показывал, кто блокирует базу, если нельзя сделать архивную копию.
|
|||
6
Cube
05.01.13
✎
07:23
|
(3) Ты, видимо, не понял, о чем речь)
|
|||
7
Aleksey
05.01.13
✎
07:24
|
(5) Ну так и показывай в блокноте?
вместо type напиши notepad (или что там у тебя в винде) Или я несовсем понял кому ты эту инфу выводишь? |
|||
8
rphosts
05.01.13
✎
07:26
|
(0) ну напиши перекодировщик своих текстовых файлов, делов0то...
|
|||
9
Cube
05.01.13
✎
07:26
|
(7) Понимаешь, это кусок батника, поэтому нужно выводить инфу в этом же окне, а не открывать новые окна.
"кому ты эту инфу выводишь?" - тому, кто будет делать архивную копию. Запустил батник, а тебе в лицо: "Не могу сделать архив, Ива Иваныч, волк тряпошный, из базы не вышел"))) |
|||
10
Cube
05.01.13
✎
07:27
|
(8) Не получается... Помоги?)
|
|||
11
rphosts
05.01.13
✎
07:31
|
(10) с сишняком/паскалем знаком?
|
|||
12
rphosts
05.01.13
✎
07:32
|
а хотя нафига! ну например http://www.softholm.com/download-software-free9813.htm
|
|||
13
Cube
05.01.13
✎
07:32
|
(11) Можно сказать, что уже нет))) Но зачем они тут? Ты хочешь внешнюю прогу наваять?
|
|||
14
Aleksey
05.01.13
✎
07:33
|
(10) wiki:Iconv
|
|||
15
Cube
05.01.13
✎
07:33
|
(12) (14) В (0) написано: "не прибегая к внешним библиотекам"
|
|||
16
Aleksey
05.01.13
✎
07:35
|
(15) Ну ты же сам просил помощи в написания конвертора?
iconv -f windows-1251 -t cp866 input.txt > output.tx |
|||
17
Cube
05.01.13
✎
07:36
|
(16) Мне не нужно писать конвертор, мне нужно сконвертировать файл средствами батника без внешних компонент. Или вывести инфу из файла в читаемом виде.
|
|||
18
rphosts
05.01.13
✎
07:40
|
(17) а разве куций язык пакетных файлов умеет организовывать циклы и пилить строку? Вроде как нет - значит и решения нет...
|
|||
19
Cube
05.01.13
✎
07:41
|
(18) По ссылке в (0) ходил? Как-то можно, но у меня не получается что-то...
|
|||
20
rphosts
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 |
|||
21
Aleksey
05.01.13
✎
07:44
|
(18) Он много что может
Куцыф он только в хелпе |
|||
22
Cube
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 Во втором файле только одна строка - путь до первого файла. |
|||
23
Aleksey
05.01.13
✎
07:47
|
(22) Логично что одна строка, у тебя же цикл не отрабатывает до конца
|
|||
24
Cube
05.01.13
✎
07:48
|
(23) Где ошибка, подскажи?
|
|||
25
rphosts
05.01.13
✎
07:52
|
(24) возврат есть?
|
|||
26
rphosts
05.01.13
✎
07:52
|
или вместо него пауза?
|
|||
27
Cube
05.01.13
✎
07:55
|
(25) (26) добавил строку "exit /b" куда надо, но результат тот же... В файле Лог_866.txt только путь до первого файла...
Думаю, что проблема в том, что я путь до первого файла указываю как строку и он её хавать не хочет... |
|||
28
Aleksey
05.01.13
✎
07:59
|
(27) Да там полно ошибок
|
|||
29
Aleksey
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 |
|||
30
Cube
05.01.13
✎
08:02
|
(28) Пинай сильнее, не стесняйся))) Укажи на ошибки, плиз.
|
|||
31
Aleksey
05.01.13
✎
08:02
|
(30) Готово :)
|
|||
32
Aleksey
05.01.13
✎
08:05
|
А ну да, после твоих манипуляций у тебя будет кодировка 1251 для вывода, поэтому нужно
chcp 866 >nul и после этого уже можно выводить more %ArchivePath%\Лог_866.txt more а не type - это чисто из моих эстетических соображений. Разница лишь в том что type выводит всю партянку, а more как только экран будет заполнен, он будет ждать нажатия кнопки и тогда следующую порцию выведет P.S. Это уже учтено в (29) |
|||
33
Aleksey
05.01.13
✎
08:05
|
А еще косяк, забыл про exit/b , кго нужно перед :End вставить
|
|||
34
Cube
05.01.13
✎
08:06
|
(29) "Почему во второй строке ковычки "%ArchivePath%\Лог.txt" - ты же не строку передаешь, а пусть к файлу, вот и пиши просто без ковычек"
Потому что путь до лога содержит пробелы. Без кавычек не взлетит. |
|||
35
Aleksey
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 |
|||
36
Aleksey
05.01.13
✎
08:07
|
(34) Должно взлететь, ты же как параметр передаешь %ArchivePath%
|
|||
37
Cube
05.01.13
✎
08:09
|
(36) Не взлетает. Говорит, что не может получить доступ к файлу "D:\1CBases\v82\Моя"...
А с кавчками он мне во второй файл пишет путь до файла 1 несколько раз подряд... |
|||
38
Aleksey
05.01.13
✎
08:11
|
(37) Не несколько раз, а ты просто дописываешь в конце
Вначале пропиши if exist "%ArchivePath%\Лог.txt" (del "%ArchivePath%\Лог.txt" /f /q) |
|||
39
Aleksey
05.01.13
✎
08:12
|
И в начале замени
set ArchivePath=D:\1CBases\v82\Моя база\Архив на set ArchivePath="D:\1CBases\v82\Моя база\Архив" И попробуй еще раз |
|||
40
Cube
05.01.13
✎
08:14
|
(39) Не взлетит, пробовал уже. Скажет, что не нашел файл D:\1CBases\v82\Моя база\Архив"\Лог.txt (кавычка в пути)
|
|||
41
rphosts
05.01.13
✎
08:24
|
ну так чё, не победили ещё?
|
|||
42
Cube
05.01.13
✎
08:24
|
(41) Неа...
|
|||
43
rphosts
05.01.13
✎
08:25
|
(22) а ты скопируй, тупо скопируй из (20) - перекодирует весь исходный файл - проверял!!!
|
|||
44
Cube
05.01.13
✎
08:26
|
(43) Я верю, что код рабочий, только в моем случае, путь до файлов может содержать русские символы и пробелы... Вот в этом-то и проблема...
|
|||
45
rphosts
05.01.13
✎
08:29
|
(44) а если путь скормить как параметр батнику? а вывод в некий фиксированный файл а в конце батника исходный мочим, резльтирующий копируем куда надо
|
|||
46
Cube
05.01.13
✎
08:30
|
(45) А где размещать фиксированный файл? В корень диска не положишь - неизвестно, есть туда у юзера доступ или нет, а в темп - так там в пути тоже русские символы и пробелы могут быть...
|
|||
47
Cube
05.01.13
✎
08:31
|
+(46) Я уж подумал о команде cd, но хз на сколько она поможет...
|
|||
48
rphosts
05.01.13
✎
08:39
|
например основной каталог юзера, вроде такой: %HOMEPATH%
|
|||
49
Aleksey
05.01.13
✎
08:40
|
(40) Удали пробелы, так как он считает что все что в ковычках строка
|
|||
50
Aleksey
05.01.13
✎
08:41
|
А он вообще "Моя база" находит? Там же кодировки разные?
|
|||
51
rphosts
05.01.13
✎
08:41
|
(49) кста, а разве в имена файлов/папок можно всякие куавычки пихать?
|
|||
52
Cube
05.01.13
✎
08:41
|
(48) Русские символы и пробелы могут быть и там...
|
|||
53
Cube
05.01.13
✎
08:42
|
(49) В смысле удалить кавычки?
|
|||
54
Aleksey
05.01.13
✎
08:42
|
(51) В мена нет, поэтому обычно и передают в виде строки
|
|||
55
rphosts
05.01.13
✎
08:42
|
(52) передавай полный путь+имя как параметр на вход пакетному файлу
|
|||
56
Cube
05.01.13
✎
08:42
|
(50) Находит...
|
|||
57
Aleksey
05.01.13
✎
08:42
|
(53) Параметры у For таки
без ковычек - путь с ковычками - строка одинарные ковычки - команда |
|||
58
Aleksey
05.01.13
✎
08:43
|
(55) Из-за пробела не взлетит. Потому что в досе пробел - разделитель команд
|
|||
59
Cube
05.01.13
✎
08:43
|
(55) Не понял...
|
|||
60
Cube
05.01.13
✎
08:43
|
(57) (58) И что делать-то?
|
|||
61
rphosts
05.01.13
✎
08:44
|
(54) т.о. это кривая папка или файл и не может считаться корректным для теста
|
|||
62
Cube
05.01.13
✎
08:46
|
(61) И что делать-то?)
|
|||
63
rphosts
05.01.13
✎
08:46
|
(59) KruchuVerchuKodyZaputatHochu.bat "D:\1CBases\v82\Моя"
а внути него вместо переданного уже как параметр имени юзать %1 |
|||
64
Aleksey
05.01.13
✎
08:47
|
(63) Не взлетит
|
|||
65
Cube
05.01.13
✎
08:48
|
(63) Что-то мне подсказывает, что это не решение проблемы...
|
|||
66
Aleksey
05.01.13
✎
08:48
|
И кстати не уверен, что
set ArchivePath=D:\1CBases\v82\Моя база\Архив нормально отработает в досе |
|||
67
Cube
05.01.13
✎
08:49
|
(66) Код из (0) работает без ошибок.
|
|||
68
rphosts
05.01.13
✎
08:50
|
(64) обоснуй
|
|||
69
Aleksey
05.01.13
✎
08:51
|
(67) ТОгда как вариант переименуй bat в cmd и попробуй запустить
|
|||
70
rphosts
05.01.13
✎
08:52
|
(69)чем бат-то не правится?
|
|||
71
Aleksey
05.01.13
✎
08:52
|
(68) потому что он подставит результат и попытается выполнить. И обломается
|
|||
72
Aleksey
05.01.13
✎
08:52
|
(70) Есть мнение, что разные интерпритаторы команд, и по разному работают
|
|||
73
Cube
05.01.13
✎
08:53
|
(69) Не помогло.
|
|||
74
Aleksey
05.01.13
✎
08:54
|
(3) Ну хз у меня работает
Ты точно убрал ковычки? |
|||
75
Aleksey
05.01.13
✎
08:54
|
текст в студию
|
|||
76
Cube
05.01.13
✎
08:55
|
(74) Не, кавычки не убирал))) Ща попробую)
|
|||
77
Cube
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\Моя"... |
|||
78
rphosts
05.01.13
✎
09:00
|
(77) имя+ путь, логнэём и пароль передавать как входные параметры
|
|||
79
Cube
05.01.13
✎
09:03
|
(78) Лог-файл создается без проблем. Ошибка возникает после этого.
|
|||
80
Cube
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... |
|||
81
Aleksey
05.01.13
✎
09:14
|
(80) Ошибка какая?
|
|||
82
Aleksey
05.01.13
✎
09:16
|
В начале почему не добавил
if exist "%ArchivePath%\Лог_866.txt" (del "%ArchivePath%\Лог_866.txt" /f /q) ну и if exist Лог_866.txt more Лог_866.txt |
|||
83
Cube
05.01.13
✎
09:17
|
(80) Если файла Лог_866.txt нет, то ошибка в крякозяблах про файл Лог.txt и ещё одна ошибка "Не удается получить доступ к файлу D:\1CBases\v82\Моя база\Архив\Лог_866.txt"
|
|||
84
Cube
05.01.13
✎
09:18
|
(82) Я все файлы вручную удаляю перед запуском. Так что, пока, не критично.
|
|||
85
Aleksey
05.01.13
✎
09:18
|
(83) Замени Лог_866.txt на Log_866.txt
И это плохой тон писать в бантике по русски |
|||
86
Cube
05.01.13
✎
09:21
|
(85) Ахахахахах!!!!!! О, дааааааааааааааааа!!!!!
Работает!)))) Тынц-тынц)))) Ща, наведу марафет и выложу, что получилось) |
|||
87
rphosts
05.01.13
✎
09:30
|
(86) марафет это ваще-то по фене укол опия! Ты там кодишь за дозу?
|
|||
88
Aleksey
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/МАРАФЕТ |
|||
89
Cube
05.01.13
✎
09:37
|
(87) (88) Имеется ввиду
"4. Прост. Приводить себя или что-л. в полный порядок (по случаю праздника, торжественной встречи кого-л. и т. п.). БМС 1998, 366; НЗС-84, 344; Глухов" Не надо тут мне... :))) Блин, жена в магаз гонит, марафет наведу минут через 20... :) |
|||
90
rphosts
05.01.13
✎
09:39
|
(89) не, ну ты код когда покажешь?
|
|||
91
Cube
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 и если в файле есть строка "Выгрузка информационной базы успешно завершена", то в условие не заходить... Поможете?) |
|||
92
Cube
05.01.13
✎
09:44
|
(91) Ну вот, вывалил имя своей базы, логин и пароль))))))))) Эх)))
|
|||
93
rphosts
05.01.13
✎
09:44
|
(91) день прожит не зря?
|
|||
94
Aleksey
05.01.13
✎
09:53
|
ping 127.0.0.1 -n 5 > nul
Замени на choice /C Y /T 5 /D Y /M "Продолжить?" |
|||
95
Aleksey
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 ) |
|||
96
Cube
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 |
|||
97
Cube
05.01.13
✎
10:24
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |