Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск файла в каталогах и сравнение даты его создания (http://forum.oszone.net/showthread.php?t=345579)

pedrosoft 19-06-2020 16:16 2925548

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

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

Код на скорую руку. Может и напутал чего, но вроде работает.
Код:

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 2925634

Fors1k, но это же не VBS.

Iska 20-06-2020 10:47 2925639

pedrosoft, но у Вас же не Windows XP?

Цитата:

Цитата pedrosoft
Буду рад любым советам. »

Писать работающие алгоритмы.

pedrosoft 20-06-2020 11:57 2925646

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

Fors1k 20-06-2020 12:27 2925650

Цитата:

Цитата pedrosoft
но это же не VBS. »

Microsoft больше не обновляет VBScript (с 2009 года), и рекомендует использовать PowerShell.

Iska 20-06-2020 13:04 2925657

pedrosoft, что происходит после п.3?

Цитата:

Цитата Fors1k
Microsoft больше не обновляет VBScript (с 2009 года) »

В реальности — намного раньше. Но это не мешает ему продолжать работать.

pedrosoft 20-06-2020 13:19 2925661

Fors1k да знаю, но увы так вышло, основная часть кода уже написана на VBS.

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

Fors1k 20-06-2020 13:45 2925668

Цитата:

Цитата Iska
Но это не мешает ему продолжать работать. »

Конечно не мешает, так как Microsoft оставит его и в будущих выпусках Windows.
Цитата:

Цитата pedrosoft
увы так вышло, основная часть кода уже написана на VBS. »

Появился повод переписать и остальную часть на PoSh. Еще и сам код сократится раз в 10 :)

pedrosoft 20-06-2020 14:26 2925672

Цитата:

Цитата Fors1k
Появился повод переписать и остальную часть на PoSh. Еще и сам код сократится раз в 10 »

Согласен, но в моем случае придется потратить еще больше времени на переписывание основного кода, который итак был написал по крупицам из интернета)

megaloman 20-06-2020 15:18 2925674

VBS
Код:

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 2925705

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 2925709

pedrosoft, Пропустили \
Код:

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

Iska 20-06-2020 23:13 2925713

pedrosoft, переименуйте Ваш «start.bat» в какой-нибудь не «start» и «.cmd».


Время: 23:16.

Время: 23:16.
© OSzone.net 2001-