Имя: Пароль:
1C
 
Как заставить скрипт подождать завершения 1cv8.exe?
0 AlStorm
 
18.08.10
10:35
Всем привет.
Пишу автоматизированный обмен. Если у меня на узел поступает файл с изменениями конфигурации, то обмен делается вот так:
1. Запускается просто 1с Предприятие и обновляются данные конфы
2. Запускается конфигуратор и обновляется конфа базы данных
3. Снова режим предприятия, обновляются данные базы

Вот так. Но в батнике учавствует стартер 1cestart.exe, которая запускает сама платформу. Так как батник ждет ее завершения (а завершается она сама практически сразу), то все 3 процесса 1cv8.exe начинают молотить практически одновременно...

Можно заставить не выгружаться 1cestart из памяти, пока не вырубится ее дочерний процесс?
PS Запускать напрямую 1cv8.exe не предлагать...
1 AlStorm
 
18.08.10
10:36
Или предложите свое решение, я тут просто голову уже сломал...
2 luns
 
18.08.10
10:38
так есть же в типовых механизм.
3 AlStorm
 
18.08.10
10:39
(2)
Какой?
4 smaharbA
 
18.08.10
10:40
1cestart.exe - это чо и нафига ?
5 zGainer
 
18.08.10
10:41
(1) У меня получают изменения (из одноэс), обновляются, если есть изменения конфы то:
ПараметрыКоманднойСтроки = "CONFIG /F " + ПутьКБД + " /N Логин /P Пароль /UpdateDBCfg";
ЗавершитьРаботуСистемы(Истина, Истина, ПараметрыКоманднойСтроки);
6 smaharbA
 
18.08.10
10:41
как сделать ожидание, даже при наличии (4) могу сказать, но вперед ответь на (4)
7 AlStorm
 
18.08.10
10:42
(4)
Йопт. Это стартер для запуска 1cv8.exe. Если на компе установлено больше одной версии платформ (дерево каталогов для 8.2 видел?), то запускает самую последнюю
8 luns
 
18.08.10
10:42
(3) автономное решение есть подсистема.
в упп и в утт для обменов риб. там и скрипты генерятся и все такое.
9 AlStorm
 
18.08.10
10:43
(5)
Ай молодца. Только ко мне не применимо. У меня все автоматом и пулеметом
10 AlStorm
 
18.08.10
10:44
(8)
А в КА есть?
11 bse
 
18.08.10
10:44
а ты не пользуйся 1cestart.exe
12 zGainer
 
18.08.10
10:44
(9) Аналогично, автоматом
13 AlStorm
 
18.08.10
10:44
(11)
А чем мне пользоваться?
14 AlStorm
 
18.08.10
10:45
(12)
Ну-ка распиши подробней. Только без участия пользователей
15 luns
 
18.08.10
10:46
а еще есть такая штука: http://infostart.ru/public/63562/
я ее допилил под себя и юзаю. очень удобно для обменов.
16 luns
 
18.08.10
10:46
(10) насчет КА не знаю. я ее только один раз юзал и эту часть (обмены) не смотрел. но думаю есть.
17 Живой Ископаемый
 
18.08.10
10:47
откройте для себя утилиты командной строки:


Запуск указанной программы или команды в отдельном окне.

START ["заголовок"] [/Dпуть] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
     [/LOW | /NORMAL | /HIGH | /REALTIME| /ABOVENORMAL | /BELOWNORMAL]
     [/WAIT] [/B]
     [команда/программа] [параметры]

   "заголовок" Заголовок окна.
   путь        Рабочий каталог.
   B           Запуск приложения без создания нового окна с отключением
               обработки сочетания клавиш ^C. Если приложение не
               обрабатывает сочетание клавиш ^C самостоятельно,
               единственным способом его прерывания является
               использование сочетания клавиш ^Break.
   I           Новой средой станет исходная среда, переданная
               cmd.exe, а не текущая среда.
   MIN         Запуск команды/программы в свернутом окне.
   MAX         Запуск команды/программы в развернутом окне.
   SEPARATE    Запуск 16-разрядной программы Windows в отдельной
               области памяти.
   SHARED      Запуск 16-разрядной программы Windows в общей
               области памяти.
   LOW         Запуск приложения с приоритетом IDLE.
   NORMAL      Запуск приложения с приоритетом NORMAL.
   HIGH        Запуск приложения с приоритетом HIGH.
   REALTIME    Запуск приложения с приоритетом REALTIME.
   WAIT        Запуск приложения с ожиданием его завершения.
================
18 Живой Ископаемый
 
18.08.10
10:48
ладно, понял, не в тему. :)
19 zGainer
 
18.08.10
10:48
(14) А ну пользователь одну кнопку таки жмет, каюсь. Интернет модемный на перифериях.
20 AlStorm
 
18.08.10
10:48
(17)
и что? То, что я написал в (0) прочитали?
21 Живой Ископаемый
 
18.08.10
10:49
2(20) не прочитал, извини. :)
22 AlStorm
 
18.08.10
10:50
(8)
А как эта подсистема может мне помочь? Что там есть?
23 AlStorm
 
18.08.10
10:56
У самого стартера 1cestart.exe параметры запуска есть?
24 luns
 
18.08.10
11:56
(22) там можно посмотреть как правильно делать скрипт обновления.
25 Stepa86
 
18.08.10
12:06
загрузку дт делаю вот так, думаю сможешь под себя модифицировать... это файл .vbs



dim CurrentPath
Set WshShell=CreateObject("WScript.Shell")

Const PathDT = "e:\Temp\1Cv8.dt"
Const InfoBaseConnectionString = "/FC:\Users\a.stepanov\Documents\InfoBase20"
Const PathProgram = "C:\Program Files\1cv82\8.2.12.75\bin\1cv8.exe"
Const CurrentPath ="d:\work\Проекты\ВКТ\ОбновлениеЧерезСкрипт\"

WshShell.Run """" & PathProgram & """ ENTERPRISE /DisableStartupMessages " & InfoBaseConnectionString &" /CЗавершитьРаботуПользователей /UCКодРазрешения /Out" & CurrentPath & "\ВыгонялкаПользователей.txt",1,1

WshShell.Popup "Завершена блокировка базы",10, "Завершена блокировка базы", 1

WshShell.Run """" & PathProgram & """ DESIGNER " & InfoBaseConnectionString &" /RestoreIB" & PathDT & " /Out" & CurrentPath & "\ЛогЗагрузкаДТ.txt /UCКодРазрешения /Visible",1,1

WshShell.Popup "Загружен dt",10, "Загружен dt", 1

WshShell.Run """" & PathProgram & """ ENTERPRISE " & InfoBaseConnectionString &" /CРазрешитьРаботуПользователей /UCКодРазрешения /Out" & CurrentPath & "\ВгонялкаПользователей.txt",1,1

WshShell.Popup "Снятие блокировки базы завершено",10, "Снятие блокировки базы завершено", 1
26 Stepa86
 
18.08.10
12:07
+(25) без "dim CurrentPath" тока
27 rcs
 
18.08.10
13:24
(0) Можно после запуска 1cestart.exe c определенной периодичностью проверять наличие процесса 1cv8.exe, если он исчез, идем дальше. Вот пример кода на vbs, который выводит список процессов:

Set ServicesSet = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.")
Set Items = ServicesSet.ExecQuery("Select * from Win32_Process")
SumStr = ""
For Each Item in Items
 strUser = ""
 strDomain = ""
 RetVal = Item.GetOwner(strUser,strDomain)
 SumStr = SumStr & Item.Name & " " & Item.Handle & " " & strUser & " " & strDomain & vbCrLf
Next
MsgBox SumStr
28 AlStorm
 
18.08.10
16:14
(27)
Можно, а если на компе 2 базы, и с обеими пользователь работает?
29 AlStorm
 
18.08.10
16:36
Короче,буду ковырять вот это: http://msdn.microsoft.com/en-us/library/system.diagnostics.process_members.aspx

ЗЫ Разработал службу для автоматического обмена абсолютно без участия пользователей и без расписания. Расписание нужно только на сервере. Кароч, буду прямо из службы глядеть, какие процессы пускает этот 1cestart и ждать их завершения..
30 rcs
 
18.08.10
18:45
(28) автообмен запускаешь от имени специально созданного пользователя windows, потом фильтруешь процессы по этому пользователю
31 1C-Nick
 
18.08.10
19:04
(29) а использовать 1cestart это обязательное условие?
32 1C-Nick
 
18.08.10
19:04
можно же в самом скрипте запускать сразу исполняемый файл 8-ки и получать идентификатор процесса, а потом ожидать его завершения
33 Ковычки
 
18.08.10
21:58
все решается в пакетнике.
(7) балавство это для недоразвитых
34 Ковычки
 
18.08.10
21:59
если надо, пеши тут
35 AlStorm
 
19.08.10
02:35
(31)(32)(33)
Я ж написал в (0) "Запускать напрямую 1cv8.exe не предлагать"

Я не хочу менять батник каждый раз как обновится платформа. А 8.2 это очень часто делает.
36 smaharbA
 
19.08.10
07:36
автор ты пейсатель ?
37 AlStorm
 
19.08.10
07:40
System.Diagnostics.Process[] AllPROCESSES;
           System.Diagnostics.Process MyProcess = new System.Diagnostics.Process();
           
           // ловим начало процесса
           DateTime TimePr = DateTime.Now;
           bool Find1c8 = false;

           while (!Find1c8)
           {
               // делаем паузу: ждем, когда появится новый процесс
               System.Threading.Thread.Sleep(500);
               AllPROCESSES = System.Diagnostics.Process.GetProcesses();
               foreach (System.Diagnostics.Process x in AllPROCESSES)
               {
                   if (x.ProcessName.ToString().Trim() == "1cv8" && x.StartTime >= TimePr)
                   {
                       MessageBox.Show("Появился процесс 1с 8!!");
                       Find1c8 = true;
                       MyProcess = x;
                   }
               }
           }
 
           // ждем, пока процесс отработает
           MyProcess.WaitForExit();

           // все!!!
           MessageBox.Show("Процесс отработал!!!");
38 AlStorm
 
19.08.10
07:41
Ну вот как-то так
39 AlStorm
 
19.08.10
07:41
Только еще таймауты добавлю.. а то мало ли что
40 smaharbA
 
19.08.10
07:43
все решается в пакетнике !
41 AlStorm
 
19.08.10
07:44
(40)
Как? Давай скажи. Только по шагам
42 smaharbA
 
19.08.10
08:26
(41) примерчик
(и ты бы первоначальный текст пакетника показал, а не умничал бы)

echo off
set prog=notepad.exe
start notepad
call :timeout 2
rem wmic process where name='%prog%' get parentprocessid /format:csv
call :getcurrentprocessid
wmic process where "not name='wmic.exe' and parentprocessid=%getcurrentprocessid%" get name
pause
wmic process where "not name='wmic.exe' and parentprocessid=%getcurrentprocessid%" call terminate
exit /b


:getcurrentprocessid () {
   @@rem Процедура получения текущего ProcessId
   @@rem
   setlocal enabledelayedexpansion
   set out=%~0
   if "%out:~0,1%"==":" (
       set out=%out:~1%
       ) else (
       set out=out
       )
   set tempout=%temp%\processid-%random%
   wmic process where "name='wmic.exe' and commandline like '%%%RANDOM%%%'" get parentprocessid | findstr /r "^[1-9]" > %tempout%
   set /p processid=< %tempout%
   set /a processid=%processid%
   endlocal && (
       set %out%=%processid%
       exit /b %processid%
       )
   }

:timeout (seconds) {
   @@rem Процедура задержки выполнения (не надеемся на наличие готового)
   @@rem
   setlocal
   set /a seconds=1
   set /a seconds=%~1 2> nul
   ping -n %seconds% 127.0.0.1 > nul
   endlocal
   exit /b 0
   }
43 Jolly Roger
 
19.08.10
08:38
тест
44 AlStorm
 
19.08.10
08:40
(42)
мммм... я в бейсик скрипте не очень.
45 AlStorm
 
19.08.10
08:41
Но идею понял. У меня круче:)
46 smaharbA
 
19.08.10
08:43
(44) причем тут бейсик ?!  - это обыкновенный пакетный файл TEST.BAT !
(45) в (42) по любому "круче" - ибо только коммандная строка и ничего )))
47 AlStorm
 
19.08.10
09:00
(46)
Объясни, что там происходит?
Я не шарю.
Я просто написал вин-службу, которая очень все упрощает для меня. Вот представь. Филиал, на нем 3 базы, работают люди. Что служба делает:
1. Видит, что появился новый файл обмена на фтп ресурсе
2. Копирует его в папку обмена для 1с
3. Распаковывает и определяет, есть ли в этом файле изменения конфигурации
4. Загружается файл обмена в режиме предприятия. Запускает через 1cestart.exe. Ждет окончания загрузки.
5. Если есть изменения (см п. 3), то завершает работу всех пользователей именно этой базы. Запускает обновление конфы базы данных. Также с помощью 1cestart.exe, ждет окончания. После этого повторяет п. 4.
6. Также просматривает наличие обратного файла с филиала в центр, и если он обнаруживается, выкладывает на фтп.
48 smaharbA
 
19.08.10
10:32
(47) тебе надо было запустить адинес через стартер, но пакетник не ждет
модифицировав (42) можно по цепочке отследить все вложенные дочерние процессы и соответственно дождаться их (в пакетнике так же реализуемо)
и служба не нужна
49 AlStorm
 
19.08.10
10:40
(48)
можно и так. Но служба у меня на самом деле для других целей. Основное назначение - в том, чтобы в филиалах данные загружались (и конфа тоже) максимум через минуты три после выгрузки в центре без участия пользователей. Даже если обмен идет вне расписания или запущен "от руки".
А то, что ты привел - круто, не знал, что такие возможности вложены в бат-файлы.
С дочерними процессами я очень не хотел заморачиваться, так как если внимательно посмотреть в диспетчере задач, как запускается восьмерка, то там между 1cestart.exe и 1cv8.exe быстро проскакивает еще и 1cv8c.exe - это вообще тонкий клиент, чего он запускается, я хз. И не факт, что 1cv8.exe - дочерний по отношению к 1cstart.exe.
Короче, одинесовцы нас круто под***али нас со своим стартером. То, что делалось раньше одной строкой в батнике делается теперь такой колбасой, что у тебя в (42)
2 + 2 = 3.9999999999999999999999999999999...