Имя: Пароль:
1C
1C 7.7
v7: После выполнения пакетника на vbs остается висеть процесс wscipt.exe
, ,
0 Andreyyy
 
12.12.13
23:25
Вот собственно скрипт: (стырил где-то для автообмена и подрихтовал для реиндексации)

Dim FSO_
Dim TempPath_
Dim reindexIniFile_
Dim LogFile_
Dim LogPath_
Dim WSH_
Dim ExePath_
Dim CentralBase_
Dim UserName_
Dim UserPass_
Dim Log1C_

Set WSH_ = CreateObject("WScript.Shell")
Set FSO_ = CreateObject("Scripting.FileSystemObject")
Set PeripheralBases_ = CreateObject("Scripting.Dictionary")

TempPath_ = "E:\AutoExchange1C\"
LogPath_ = "E:\AutoExchange1C\reindex.log"
ExePath_ = "C:\Program Files\1Cv77\BIN\1cv7.exe"

CentralBase_ = "D:\1cBases\Base\"
UserName_ = "Администратор"
UserPass_ = "005"

Set reindexIniFile_ = FSO_.CreateTextFile(TempPath_ & "reindex.ini")
reindexIniFile_.WriteLine "[General]"
reindexIniFile_.WriteLine "CheckAndRepair = 1"
reindexIniFile_.WriteLine "Output = """ & TempPath_ & "reindex.log"""
reindexIniFile_.WriteLine "[CheckAndRepair]"
reindexIniFile_.WriteLine "Repair = 0"
reindexIniFile_.WriteLine "PhysicalIntegrity = 0"
reindexIniFile_.WriteLine "Reindex = 1"
reindexIniFile_.WriteLine "LogicalIntegrity = 0"
reindexIniFile_.WriteLine "RecalcSecondaries = 0"
reindexIniFile_.WriteLine "RecalcTotals = 0"
reindexIniFile_.WriteLine "Pack = 0"
reindexIniFile_.WriteLine

Set LogFile_ = FSO_.CreateTextFile(LogPath_)

WSH_.Run """" & ExePath_ & """ CONFIG /D""" & CentralBase_ & """ /N" & UserName_ & _
        " /P" & UserPass_ & " /@""" & TempPath_ & "reindex.ini" & """", 1, True

LogFile_.WriteLine "**************************************************"
LogFile_.WriteLine CentralBase_
LogFile_.WriteLine "=================================================="
If FSO_.FileExists(TempPath_ & "reindex.log") Then
    Set Log1C_ = FSO_.GetFile(TempPath_ & "reindex.log").OpenAsTextStream(1, -2)
    While Not Log1C_.AtEndOfStream
        LogFile_.WriteLine Log1C_.readLine
    Wend
    Log1C_.Close
    FSO_.DeleteFile(TempPath_ & "reindex.log")
End If


FSO_.DeleteFile(TempPath_ & "reindex.ini")

LogFile_.Close


1С-ка индексируется, закрывается. Типа все нормально. А wscipt.exe висит, жрет 25% процессора (т.е. 1 ядро) и + запускается это дело через планировщик в Windows 2003, так там так и остается висеть это задание как "Выполняется".

Что сделал не так ?
1 МихаилМ
 
12.12.13
23:32
для vbs тоже есть отладчик
2 Andreyyy
 
12.12.13
23:40
(1) Спасибо, понял куда копать.
3 КонецЦикла
 
13.12.13
00:40
Не понял
У тебя DBF?
Не проще ли батник на удаление CDX, там одна строка будет?
А задание для надежности пусть срубает сам планировщик, см. свойства
4 Andreyyy
 
13.12.13
03:22
(3) ИМХО по правильному делать: раз предусмотрена фишка через пакетник индексация, значит так. А не с косой бегать.
В задании поставил отрубать через N времени, но все равно постараюсь добить этот vbs. На крайний случай пакетник срзу текстовиком напишу и через bat запускать.
5 Armando
 
13.12.13
03:33
WScript.Quit не?
6 Andreyyy
 
13.12.13
04:26
(5) Не помогло.
Но ведь идентичный скрипт с формированием и выполнением пакетника обмена УРБД не зависает с этим процессом.
7 Морозов Александр
 
13.12.13
05:51
вот людям делать нечего... сидят через скрипт каждый раз создают пакетный файл для 1с...
8 Мутабор
 
13.12.13
06:09
Где закрытие открытых файлов
9 Мутабор
 
13.12.13
06:09
Удаляешь не закрытый файл
10 Torquader
 
14.12.13
00:18
Здесь мы получаем объект "Файл", а не поток чтения.
Set Log1C_ = FSO_.GetFile(TempPath_ & "reindex.log").OpenAsTextStream(1, -2)

Здесь мы его читаем (точнее проверяем на конец)
While Not Log1C_.AtEndOfStream

Но файл-то не открыт !!!

Или ошибка или "вечный цикл".
11 Torquader
 
14.12.13
00:20
В общем, проще делать FSO_.OpenTextFile(TempPath_ & "reindex.log",False,-2)
чтобы не передали несозданный объект, который потом открыли на чтение.
12 Andreyyy
 
14.12.13
04:28
(10) Вечный цикл - файл reindex.log растет долго и упорно.
(11Й) Спасибо.
13 Torquader
 
14.12.13
18:27
(12) У WScript.Shell, насколько я помню, есть Exec, который позволяет получить указатель для отслеживания завершения процесса, что в данном случае, лучше всего.
Кусок LOG-файла можно получить, замерив его размер до запуска и после завершения, а потом сделав Skip(SizeBefore) и Read(SizeAfter-SizeBefore) и получить кусок в строку (если много, то можно по кускам, скажем 4096 байт).
14 Andreyyy
 
14.12.13
20:19
(13) Скрипт для обмена УРБД нашел на просторах интернета.
Сам в синтаксисе vbs никак.

Почему-то вот это работает без зацикливания, хотя все как бы 1 в 1:

Dim FSO_
Dim TempPath_
Dim ReadIniFile_
Dim WriteIniFile_
Dim LogFile_
Dim LogPath_
Dim WSH_
Dim ExePath_
Dim CentralBase_
Dim UserName_
Dim UserPass_
Dim Log1C_

Set WSH_ = CreateObject("WScript.Shell")
Set FSO_ = CreateObject("Scripting.FileSystemObject")
Set PeripheralBases_ = CreateObject("Scripting.Dictionary")

TempPath_ = "E:\AutoExchange1C\"
LogPath_ = "E:\AutoExchange1C\AutoExch1C.log"
ExePath_ = "C:\Program Files\1Cv77\BIN\1cv7.exe"

CentralBase_ = "D:\1cBases\Base\"
UserName_ = "Администратор"
UserPass_ = "005"

Set ReadIniFile_ = FSO_.CreateTextFile(TempPath_ & "Read.ini")
ReadIniFile_.WriteLine "[General]"
ReadIniFile_.WriteLine "AutoExchange = 1"
ReadIniFile_.WriteLine "Output = """ & TempPath_ & "Read.log"""
ReadIniFile_.WriteLine "[AutoExchange]"
ReadIniFile_.WriteLine "SharedMode = 1"
ReadIniFile_.WriteLine "ReadFrom = *"
ReadIniFile_.Close

Set WriteIniFile_ = FSO_.CreateTextFile(TempPath_ & "Write.ini")
WriteIniFile_.WriteLine "[General]"
WriteIniFile_.WriteLine "AutoExchange = 1"
WriteIniFile_.WriteLine "Output = """ & TempPath_ & "Write.log"""
WriteIniFile_.WriteLine "[AutoExchange]"
WriteIniFile_.WriteLine "SharedMode = 1"
WriteIniFile_.WriteLine "WriteTo = *"
WriteIniFile_.Close

Set LogFile_ = FSO_.CreateTextFile(LogPath_)

WSH_.Run """" & ExePath_ & """ CONFIG /D""" & CentralBase_ & """ /N" & UserName_ & _
        " /P" & UserPass_ & " /@""" & TempPath_ & "Read.ini" & """", 1, True

LogFile_.WriteLine "**************************************************"
LogFile_.WriteLine CentralBase_
LogFile_.WriteLine "=================================================="
If FSO_.FileExists(TempPath_ & "Read.log") Then
    Set Log1C_ = FSO_.GetFile(TempPath_ & "Read.log").OpenAsTextStream(1, -2)
    While Not Log1C_.AtEndOfStream
        LogFile_.WriteLine Log1C_.ReadLine
    Wend
    Log1C_.Close
    FSO_.DeleteFile(TempPath_ & "Read.log")
End If


WSH_.Run """" & ExePath_ & """ CONFIG /D""" & CentralBase_ & """ /N" & UserName_ & _
        " /P" & UserPass_ & " /@""" & TempPath_ & "Write.ini" & """", 1, True

LogFile_.WriteLine "**************************************************"
LogFile_.WriteLine CentralBase_
LogFile_.WriteLine "=================================================="
If FSO_.FileExists(TempPath_ & "Write.log") Then
    Set Log1C_ = FSO_.GetFile(TempPath_ & "Write.log").OpenAsTextStream(1, -2)
    While Not Log1C_.AtEndOfStream
        LogFile_.WriteLine Log1C_.ReadLine
    Wend
    Log1C_.Close
    FSO_.DeleteFile(TempPath_ & "Write.log")
End If


FSO_.DeleteFile(TempPath_ & "Read.ini")
FSO_.DeleteFile(TempPath_ & "Write.ini")

LogFile_.Close
15 Torquader
 
15.12.13
21:16
Мужик!

А то, что ты читаешь и пишешь один и тот же файл ?

TempPath_ = "E:\AutoExchange1C\"
LogPath_ = "E:\AutoExchange1C\reindex.log"

Set LogFile_ = FSO_.CreateTextFile(LogPath_)

If FSO_.FileExists(TempPath_ & "reindex.log") Then
    Set Log1C_ = FSO_.GetFile(TempPath_ & "reindex.log").OpenAsTextStream(1, -2)
    While Not Log1C_.AtEndOfStream
        LogFile_.WriteLine Log1C_.readLine
    Wend
    Log1C_.Close
    FSO_.DeleteFile(TempPath_ & "reindex.log")
End If

Поздравляем с созданием программы по засиранию диска - Professional level detected.

P.S. ты в log-файл-то заглядывал - если в Far-е глянуть, то должно быть ясно, что случилось "чудо".

Удачи.