|
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-е глянуть, то должно быть ясно, что случилось "чудо". Удачи. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |