Имя: Пароль:
IT
 
Проблема с кодировкой лог-файла 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
Aleksey и rphosts спасибо большое)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.