:: Вопросы по 1С
получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
Доброго времени суток всем! Есть такая задача. Через 1С разархивировать кучу файлов в формате 7z с помощью программки 7z.exe из пакета программы 7zip. Все отрабатывает красиво и правильно. НО! Если файл архива поврежден - 7z его не распаковывает и идет дальше. Нужно в программе 1С сообщать о том что файл поврежден. У программы 7z.exe есть коды на выходе:
Цитата:
Exit Codes from 7-Zip
7-Zip returns the following exit codes:

Code Meaning
0 No error
1 Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2 Fatal error
7 Command line error
8 Not enough memory for operation
255 User stopped the process

Вот код как вызываю 7z в 1С:
ПрограммаАрхивации = "c:\Program Files\7-Zip\7z.exe";
МассивНайденныхФайлов = НайтиФайлы(КаталогФайлов, "*.7z");
Для Каждого Файл из МассивНайденныхФайлов Цикл
КаталогРазархивирования = КаталогФайлов + "\00";
РазархивироватьФайл(ПрограммаАрхивации, Файл.ПолноеИмя, КаталогРазархивирования);
КонецЦикла;
...
Процедура РазархивироватьФайл(Программа, Файл, Каталог) Экспорт
//e - разархивировать
//-y - ответить Да на все запросы
//-o - установить каталог выхода
КоммандаЗапуска = Программа + " e " + Файл + " -y -o" + Каталог;
ЗапуститьПриложение(КоммандаЗапуска, Каталог, Истина);
КонецПроцедуры
Как мне получить в 1С сообщения о том, что 7z не смог допустим распаковать файл?
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
PaulWist

Сообщений: 14696
Дата регистрации: 01.04.2004
forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
Идея понятна и вроде все сделал как надо. НО! Результат не тот какой ожидалось.
Вот новый код:
Оболочка = Новый COMObject("wScript.Shell");
ПрограммаАрхивации = "c:\Program Files\7-Zip\7z.exe";
МассивНайденныхФайлов = НайтиФайлы(КаталогФайлов, "*.7z");
Для Каждого Файл из МассивНайденныхФайлов Цикл
КаталогРазархивирования = КаталогФайлов + "\00";
КоммандаЗапуска = "cmd /C " + ПрограммаАрхивации + " e " + Файл.ПолноеИмя + " -y -o" + КаталогРазархивирования;
ОтветОболочки = Оболочка.Run(КоммандаЗапуска, 0, Ложь);
Если ОтветОболочки = 0 Тогда
Сообщить("Все нормально.");
ИначеЕсли ОтветОболочки = 1 Тогда
Сообщить("Предупреждение: файл для разархивирования занят!");
ИначеЕсли ОтветОболочки = 2 Тогда
Сообщить("Критическая ошибка разархивирования!");
ИначеЕсли ОтветОболочки = 7 Тогда
Сообщить("Критическая ошибка в командной строке разархивирования!");
ИначеЕсли ОтветОболочки = 8 Тогда
Сообщить("Недостаточно памяти для разархивирования!");
ИначеЕсли ОтветОболочки = 255 Тогда
Сообщить("Процесс разархивирования прерван пользователем!");
Иначе
Сообщить("Неизведанная ошибка!");
КонецЕсли;
КонецЦикла;
Если пишешь ОтветОболочки = Оболочка.Run(КоммандаЗапуска, 0, Ложь); - он ничего не делает и не показывает, отвечает -
Цитата:
"Все нормально."
Если пишешь ОтветОболочки = Оболочка.Run(КоммандаЗапуска, 0, Истина); - он ничего не делает, что-то показывает, отвечает -
Цитата:
"Предупреждение: файл для разархивирования занят!"
Может я что то делаю не так?
В первом посте через процедуру он хоть разархивировал - а тут совсем не фурычит шарманка (((
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
PaulWist
https://forum.foxclub.ru/read.php?29,493895,493936#msg-493936
мало того - попробовал через foxpro тоже самое - результат такой же!
Цитата:
Предупреждение: файл для разарх./арх. занят
вот код программки:
l7z = "c:\Program Files\7-Zip\7z.exe"
lfile = "c:\temp\proba.7z"
lfolder = "c:\temp\00"
lcommandstring = "cmd /C " + l7z + " e " + lfile + " -y -o" + lfolder
loShell = CREATEOBJECT("Wscript.Shell")
lnResult = loShell.Run(lcommandstring,0,.T.) && параметр .T. кагбе намекает на подождать пока не закончится процесс
DO CASE
CASE lnResult = 0 && Всё хорошо, делаем команды
?lfile
CASE lnResult = 1
MESSAGEBOX('Предупреждение: файл для разарх./арх. занят',0+16+0,'Ошибка')
CASE lnResult = 2
MESSAGEBOX('Критическая ошибка разарх./арх.',0+16+0,'Ошибка')
CASE lnResult = 7
MESSAGEBOX('Критическая ошибка в '+CHR(13)+'командной строке разарх./арх.',0+16+0,'Ошибка')
CASE lnResult = 8
MESSAGEBOX('Недостаточно памяти для разарх./арх.',0+16+0,'Ошибка')
CASE lnResult = 255
MESSAGEBOX('Процесс разарх./арх. прерван пользователем',0+16+0,'Ошибка')
OTHERWISE
MESSAGEBOX('Неизведанная ошибка',0+16+0,'Ошибка')
ENDCASE

Может еще какие способы будут как мне получить из 1с коды ошибок от программы 7z?



Исправлено 1 раз(а). Последнее : djeday, 11.08.11 13:05
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
если нужен отлов ошибки, то наверное только через Новый COMОбъект()


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
PaulWist

Сообщений: 14696
Дата регистрации: 01.04.2004
lcommandstring = "cmd /C " + ['] + l7z + " e " + lfile + " -y -o" + lfolder + [']


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
PaulWist
lcommandstring = "cmd /C " + ['] + l7z + " e " + lfile + " -y -o" + lfolder + [']
тоже самое -
Цитата:
Предупреждение: файл для разарх./арх. занят
Может у меня что то с системой? Кто нибудь попробуйте хотя бы на FoxPro код - что выдаст?
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
Все - сам разобрался!
Если пишешь путь к программе "c:\temp\7z.exe", а не "c:\Program Files\7-Zip\7z.exe" - все делает на ура!! (соответственно 7z.exe должно там лежать)
Код на FoxPro:
l7z = "c:\temp\7z.exe"
lfile = "c:\temp\proba.7z"
lfolder = "c:\temp\00"
lcommandstring = "cmd /C " + l7z + " e " + lfile + " -y -o" + lfolder
*!* lcommandstring = "cmd /C ping 127.0.0.1"
loShell = CREATEOBJECT("Wscript.Shell")
lnResult = loShell.Run(lcommandstring,0,.T.)
MESSAGEBOX(STR(lnResult))
DO CASE
CASE lnResult = 0 && Всё хорошо, делаем команды
?lfile
CASE lnResult = 1
MESSAGEBOX('Предупреждение: файл для разарх./арх. занят',0+16+0,'Ошибка')
CASE lnResult = 2
MESSAGEBOX('Критическая ошибка разарх./арх.',0+16+0,'Ошибка')
CASE lnResult = 7
MESSAGEBOX('Критическая ошибка в '+CHR(13)+'командной строке разарх./арх.',0+16+0,'Ошибка')
CASE lnResult = 8
MESSAGEBOX('Недостаточно памяти для разарх./арх.',0+16+0,'Ошибка')
CASE lnResult = 255
MESSAGEBOX('Процесс разарх./арх. прерван пользователем',0+16+0,'Ошибка')
OTHERWISE
MESSAGEBOX('Неизведанная ошибка',0+16+0,'Ошибка')
ENDCASE
На 1С тоже все работает, стоит только заменить путь к 7z.
С проблемой использования составных путей к нужным программам буду заниматься позже - пока только вот так.



Исправлено 2 раз(а). Последнее : djeday, 12.08.11 07:35
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
djeday
С проблемой использования составных путей к нужным программам буду заниматься позже - пока только вот так.
Поправочка для FoxPro, в полном пути к 7z.exe можно использовать составные названия папок (работает только с двойными кавычками).
lcommandstring = "cmd /c " + ["] + l7z + ["] + " e " + lfile + " -y -o" + lfolder
Для установки папки, куда распаковывать, если в ее полном пути есть составные названия - кавычки не помогают - лечится путем перехода в нужную папку и из нее вызывать 7z для распаковки (switch -o не нужен).
Аналогично в 1С.



Исправлено 2 раз(а). Последнее : djeday, 12.08.11 11:27
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
Taran

Сообщений: 13740
Откуда: Красноярск
Дата регистрации: 16.01.2008
djeday
Для установки папки, куда распаковывать, если в ее полном пути есть составные названия - кавычки не помогают - лечится путем перехода в нужную папку и из нее вызывать 7z для распаковки (switch -o не нужен).
Аналогично в 1С.
Попробуй закавычить папку назначения вместе с именно с этим ключиком
[cmd /c "] + l7z + [" e ]+ lfile + [ -y "-o] + lfolder+["]

В догонку. Глянь, может мысль придет.
lofso=CREATEOBJECT('Scripting.FileSystemObject')
loFolder=lofso.GetFolder("C:\Program Files\7-Zip\")
MESSAGEBOX(loFolder.ShortPath)
lofile=lofso.GetFile("C:\Program Files\7-Zip\7z.exe")
MESSAGEBOX(lofile.ShortPath)



Исправлено 1 раз(а). Последнее : Taran, 12.08.11 11:45
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
wolf3d

Сообщений: 53
Дата регистрации: 17.02.2010
мдя... грустно(
совсем отвык народ от старых, добрых .bat
проблема решалась за 5 минут)
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Да она и так решается за 5 минут - но с путями имеющими пробелы конечно же необходимо считаться И в батниках тоже...
Кстати, не проще ли будет прописать путь к 7z в PATH и для его вызова вообще не использовать "полный путь"? Я именно так и делаю для архиваторов (правда я их сами дополнительно копирую в C:\Utils\ - а то не напасёшься длины PATH на всё многообразие утилит которые удобно вызывать "просто по имени")
Впрочем, и для "входного" и для "выходного" путей, если они не могут быть заданы "относительно текущего" - всё одно придётся "кавычить".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
Taran

Сообщений: 13740
Откуда: Красноярск
Дата регистрации: 16.01.2008
Работает без кавычек вообще.
lofso = CREATEOBJECT('Scripting.FileSystemObject')
loShell = CREATEOBJECT("Wscript.Shell")
loSrcFolder = lofso.GetFolder("C:\Program Files\7-Zip\")
lcArcDir = "c:\___tmp arc dir\"
MD (lcArcDir)
loArcFolder = loFSO.GetFolder(lcArcDir)
lo7Z = lofso.GetFile("C:\Program Files\7-Zip\7z.exe")
lcCMD = lo7Z.ShortPath+" a "+ ADDBS(loArcFolder.ShortPath) +"NewArc.7z "+loSrcFolder.ShortPath
MESSAGEBOX(lcCMD)
lnResult = loShell.Run(lcCMD,0,.T.)
MESSAGEBOX(lnResult)
lcExtrDir = "c:\___tmp extr dir"
MD (lcExtrDir)
loExtFolder = lofso.GetFolder(lcExtrDir)
lcCMD = lo7Z.ShortPath+" x "+ ADDBS(loArcFolder.ShortPath) +"NewArc.7z -o"+loExtFolder.ShortPath
MESSAGEBOX(lcCMD)
lnResult = loShell.Run(lcCMD,0,.T.)
MESSAGEBOX(lnResult)
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
djeday
Автор

Сообщений: 7
Дата регистрации: 11.08.2011
Действительно - работает в FoxPro.
В 1С я ограничился тем что архивы и программу архиватор положил в папку без пробелов - так надежнее :-[
А вообще - всем спасибо кто откликнулся!
Ratings: 0 negative/0 positive
Re: получение отчета о работе от 7z
Taran

Сообщений: 13740
Откуда: Красноярск
Дата регистрации: 16.01.2008
Ну это если у тебя есть возможность в корне диска создавать файлы и папки. Что бывает не всегда.
По умолчанию и папка временных файлов с пробелами.
Так что как-то так.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 6 (Гостей: 6)

© 2000-2024 Fox Club 
Яндекс.Метрика