PDA

Показать полную графическую версию : Поиск файла в каталогах и сравнение даты его создания


pedrosoft
19-06-2020, 16:16
Приветствую!

Прошу подсказать, как можно на 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 "Пульты заняты"

Буду рад любым советам. Спасибо!

Fors1k
19-06-2020, 23:05
Код на скорую руку. Может и напутал чего, но вроде работает.
param(
$path = 'z:\ops',
$file = 'file.lock'
)cls

gci $path|foreach{$run={start "$args\start.bat" -WindowStyle h}
if($f = (gi "$($_.FullName)\lock\$file" -ea 0).LastWriteTime){
if(((Date) - $f).hours -ne 0){$a = 1;&$run $_.FullName}}
else{$a=1;&$run $_.FullName}};if($a-ne 1){"Все пульты заняты."}

pedrosoft
20-06-2020, 10:08
Fors1k, но это же не VBS.

Iska
20-06-2020, 10:47
pedrosoft, но у Вас же не Windows XP?

Буду рад любым советам. »
Писать работающие алгоритмы.

pedrosoft
20-06-2020, 11:57
Дело в том, что уже есть более большой скрипт на VBS и я хотел дополнить его указанным выше функционалом.

Fors1k
20-06-2020, 12:27
но это же не VBS. »
Microsoft больше не обновляет VBScript (с 2009 года), и рекомендует использовать PowerShell. (https://docs.microsoft.com/en-us/previous-versions//4y5y7bh5(v=vs.85)?redirectedfrom=MSDN)

Iska
20-06-2020, 13:04
pedrosoft, что происходит после п.3?

Microsoft больше не обновляет VBScript (с 2009 года) »
В реальности — намного раньше. Но это не мешает ему продолжать работать.

pedrosoft
20-06-2020, 13:19
Fors1k да знаю, но увы так вышло, основная часть кода уже написана на VBS.

Iska после пункта 3 происходит запуск bat-файла, это финальная часть работы VBS.

Fors1k
20-06-2020, 13:45
Но это не мешает ему продолжать работать. »
Конечно не мешает, так как Microsoft оставит его и в будущих выпусках Windows. (https://wiki2.org/en/VBScript)
увы так вышло, основная часть кода уже написана на VBS. »
Появился повод переписать и остальную часть на PoSh. Еще и сам код сократится раз в 10 :)

pedrosoft
20-06-2020, 14:26
Появился повод переписать и остальную часть на PoSh. Еще и сам код сократится раз в 10 »
Согласен, но в моем случае придется потратить еще больше времени на переписывание основного кода, который итак был написал по крупицам из интернета)

megaloman
20-06-2020, 15:18
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

pedrosoft
20-06-2020, 21:47
megaloman супер, спасибо вам. Завтра протестирую.

Покажите, а если файл start.bat будет лежать не на уровень выше, а соседнем каталоге, т.е.:
z:\ops\dirXX\lock\file.lock
z:\ops\dirXX\init\start.bat

Cлишком ли грязным будет решение просто изменить первую строку на:
If Not Pult("z:\ops", "dir", 2, "lock", "file.lock", "init\start.bat", 3600) Then WScript.Echo "Пульты заняты"
?

megaloman
20-06-2020, 22:11
pedrosoft, Пропустили \If Not Pult("z:\ops", "dir", 2, "lock", "file.lock", "\Init\start.bat", 3600) Then WScript.Echo "Пульты заняты"
Ваше предложение работает, проверил.

Iska
20-06-2020, 23:13
pedrosoft, переименуйте Ваш «start.bat» в какой-нибудь не «start» и «.cmd».




© OSzone.net 2001-2012