Помочь написать на Vbscript | Крымский форум

Помочь написать на Vbscript

  • Добро пожаловать на форум! Рады видеть вас здесь! Зарегистрируйтесь или Войдите в аккаунт, чтобы иметь полный доступ к площадке!

pedro

Местный житель
Абориген
Сообщения
397
Реакции
3
Репутация
15
Приветствую!

К сожалению VBS не знаю от слова совсем, прошу подсказать, как можно выполнить обход каталогов, на предмет отсутствия файла file.lock либо его старости, такой структуры:
z:\ops\dir01\lock\
...
z:\ops\dirXX\lock\

Алгоритм такой:
1. Начинаем обход каталогов по указанной структуре (dir01\lock\ - dirXX\lock\)
2. Как только находим каталог без файла file.lock либо с файлом file.lock но датой его создания более 60 минут назад, останавливаем поиск
3. Запускаем из этого каталога bat-скрипт wshShell.Run "cmd.exe /c z:\ops\" & SearchDir & "\start.bat", 0, False (т.е. bat-файл будет лежать на один уровень выше, чем file.lock)
4. Если каталог без файла file.lock не найден, либо файл file.lock создан не позднее 60 минут назад - выводим сообщение WScript.Echo "Занято"

Буду рад любым советам. Спасибо!
 
чем обусловлен выбор вэбэскрипт-а:
1. старостью винды?
2. заданием кого-то?
3. скверностью характера?

ибо уже более 10 лет(начиная с 7-ки?) вовсю используется powershell.
 
Это будет частью уже существующего вэбэскрипт-а.
 
Цитата(obscure @ 20 Июня, 2020, 7:41)
ибо уже более 10 лет(начиная с 7-ки?) вовсю используется powershell

Абсолютно не имеет значение на чем исполняется скрипты, cmd, vbs, PS или экзотика по типу cygwin если задача делается.
Цитата(pedro @ 19 Июня, 2020, 21:55)
Буду рад любым советам.

Попробуйте поискать тут, там 45 страниц готовых скриптов, может найдете для себя что нибудь.
Ну и придется подучить команды и синтаксис.
 
Эх. вот опять-же. И с одного боку в постановке фигня-задача, и с другого, я хоть сколь нормальной документации по VBS в своё время так и не нашёл.
 
Цитата(DeNpivTresT @ 21 Июня, 2020, 6:52)
Абсолютно не имеет значение

спасибо, кэп!

pedro, User80218 куски решения гугляться за 20 минут
подозреваю, что ТС "слегка" поленился

pedro
так, как язык для меня незнакомый - потратил час
рабочая платформа предрасполагает более к башам, перлам, питонам(в крайнем случае)
так, что код накидал "чисто теоретически", исходя из полного отсутствия опыта по вэбэс-крипту,
писал наскоряк, под никсами, не проверял
возможно где-то косяк

В случае обнаружения оного(косяка) - курсор Вам в руки

Вариант решения всёравно должен быть близок к нижеописанному:
Код

'функция проверялка
Function IsFolderBusy(FilePath)
 Dim fso, f
 Set fso = CreateObject("Scripting.FileSystemObject")
 'Если файл существует
 If fso.FileExists(FilePath) Then
   Set f = fso.GetFile(FilePath)
   'проверяем его на "моложавость": дата модификации,
   'по сравнению с текущим временем  должна быть старше не более, чем на 3600 секунд
If DateDiff("s",strFile.DateLastModified,Now) < 3600 Then
 'файл молод - возвращаем Истину
 IsFolderBusy=CBool(1)
Else
 'файл стар - возвращаем ложЪ
 IsFolderBusy=CBool(0)
   End If
 Else
'файл отсутствует - возвращаем ложЪ
   IsFolderBusy=CBool(0)
 End If
End Function

'основной код
'описываем массив строк с путями к каталогам
dim Dirlist, CurrDir, FullPath
Set Dirlist = CreateObject("System.Collections.ArrayList")
Dirlist.Add "z:\ops\dir01\"
Dirlist.Add "z:\ops\dir02\"
Dirlist.Add "z:\ops\dir03\"

'в цикле перебираем массив
For Each CurrDir in Dirlist
Set FullPath = CurrDir&"lock\file.lock"
   If IsFolderBusy(FullPath)  Then
 wscript.echo CurrDir&"lock\ is Busy", vbCRLF
   Else
 wshShell.Run "cmd.exe /c CurrDir&"\start.bat", 0, False
   End If

Next

'кАнЕц
 
obscure, спасибо большое, попробую ваш вариант.
 
Цитата(pedro @ 23 Июня, 2020, 16:15)
спасибо большое, попробую ваш вариант

та незачто

если заработает с минимальными правками или вообще без оных - сообщите, я хлопну вискарика по этому поводу
smoke.gif

писать под неподдерживающей осью, без проверки, на незнакомом языке - так себе увлечение
в случае успеха - бахнуть нужно обязательно
bigwink.gif
 
Не работает, но бахнуть конечно можете, спасибо большое за помощь) Если вам интересно, вот работающий вариант:
Код

If Not Pult("z:\ops", "dir", 2, "lock", "file.lock", "start.bat", 3600) Then WScript.Echo "Пульты заняты"
'-------------
Function Pult(DirPre, DirRoot, DirNlen, DirSuff, FileLock, FileBat, OldSec)
Pult = False
iii = 10000000

With CreateObject("Scripting.FileSystemObject")
For i = iii To iii + 10 ^ DirNlen - 1
SearchDir = DirRoot + Right(CStr(i), DirNlen)
dFile = DirPre + "\" + SearchDir + "\" + DirSuff
If .FolderExists(dFile) Then
iFile = dFile + "\" + FileLock
If .FileExists(iFile) Then
Pult = DateDiff("s", .GetFile(iFile).DateLastModified, Now) > OldSec
Else
Pult = True
End If
If Pult Then
' MsgBox "cmd.exe /c " + DirPre + "\" + SearchDir + "\" + FileBat
CreateObject("WScript.Shell").Run "cmd.exe /c """ + DirPre + "\" + SearchDir + "\" + FileBat + """, 0, False"
Exit For
End If
End If
Next
End With
End Function
 
Цитата(pedro @ 25 Июня, 2020, 11:12)
Не работает

ладно, когда-нить буду в винде - попробую отладить.

особой разницы в коде не заметил, акромя динамич обхода каталогов.
и использования "+" вместо "&" для конкатенации

яж по документации код писал, без запуска, на незнакомом языке
 
Цитата
яж по документации код писал, без запуска, на незнакомом языке

Сильно извиняюсь, но уж очень меня удивил такой подход...
А че, так можно было что ли?
smile.gif

Это как стихи на корейском по справочнику иероглифов
smile.gif
 
Цитата(mim @ 26 Июня, 2020, 12:11)
А че, так можно было что ли?

Цитата(pedro @ 19 Июня, 2020, 22:55)
Буду рад любым советам. Спасибо!

Цитата(pedro @ 19 Июня, 2020, 22:55)
прошу подсказать, как можно выполнить обход каталогов,


таких вводных достаточно?

Цитата(mim @ 26 Июня, 2020, 12:11)
Сильно извиняюсь, но уж очень меня удивил такой подход...

не удивляетесь - циклы есть во многих языках программирования, ровно , как и ветвления.

а то, что до конкретной реализации - есть нюансы с использованием сист.библиотек.

сам алгоритм - рабочий
за помощь - ТС поблагодарил


считайте, что я привёл пример на псевдокоде.

если вам знакома такая метода - можете сильно не извиняттся
 
Назад
Сверху